<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[My Tech Life]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://blog.mutiangpili.com/</link><image><url>https://blog.mutiangpili.com/favicon.png</url><title>My Tech Life</title><link>https://blog.mutiangpili.com/</link></image><generator>Ghost 5.71</generator><lastBuildDate>Tue, 27 Oct 2026 07:28:44 GMT</lastBuildDate><atom:link href="https://blog.mutiangpili.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[🚀 From Zero Visibility to Full Observability: Monitoring Docker Infrastructure with Prometheus and Grafana]]></title><description><![CDATA[<p>A Practical DevOps Guide to Building a Real-Time Infrastructure Monitoring Stack Using Docker Compose, Prometheus, Node Exporter, and Grafana</p><h2 id="introduction-you-cant-fix-what-you-cant-see">Introduction: You Can&apos;t Fix What You Can&apos;t See</h2><p>Imagine this scenario.</p><p>It&apos;s 2:00 AM. Your production application suddenly becomes unresponsive. Users are complaining, transactions</p>]]></description><link>https://blog.mutiangpili.com/from-zero-visibility-to-full-observability-monitoring-docker-infrastructure-with-prometheus-and-grafana/</link><guid isPermaLink="false">6ac73091c1a81905d7a0e5f0</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Mon, 26 Oct 2026 12:51:24 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/10/ChatGPT-Image-Oct-8--2026--01_58_10-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/10/ChatGPT-Image-Oct-8--2026--01_58_10-PM.png" alt="&#x1F680; From Zero Visibility to Full Observability: Monitoring Docker Infrastructure with Prometheus and Grafana"><p>A Practical DevOps Guide to Building a Real-Time Infrastructure Monitoring Stack Using Docker Compose, Prometheus, Node Exporter, and Grafana</p><h2 id="introduction-you-cant-fix-what-you-cant-see">Introduction: You Can&apos;t Fix What You Can&apos;t See</h2><p>Imagine this scenario.</p><p>It&apos;s 2:00 AM. Your production application suddenly becomes unresponsive. Users are complaining, transactions are failing, and your infrastructure team is scrambling to identify the root cause.</p><p>Is it CPU saturation? Memory exhaustion? Disk utilization? Or perhaps a server that quietly stopped responding?</p><p>Without proper monitoring, troubleshooting becomes a guessing game.</p><p>As infrastructure engineers, we need more than servers that are simply running. We need <strong>visibility into how our infrastructure behaves over time</strong>.</p><p>This is where <strong>Prometheus and Grafana</strong> come into play.</p><p>In this tutorial, we&apos;ll build a lightweight yet powerful monitoring solution using Docker Compose.</p><p>By the end, you&apos;ll have a working monitoring stack capable of:</p><ul><li>Collecting real-time CPU, memory, disk, and network metrics.</li><li>Monitoring Linux server health using Node Exporter.</li><li>Storing time-series metrics in Prometheus.</li><li>Visualizing infrastructure performance in Grafana.</li><li>Importing a professional infrastructure dashboard.</li><li>Understanding basic PromQL queries.</li><li>Preparing your environment for production monitoring and alerting.</li></ul><p>And the best part?</p><p><strong>You can deploy the entire stack using a single Docker Compose command.</strong></p><hr><h2 id="1-understanding-the-monitoring-architecture">1. Understanding the Monitoring Architecture</h2><p>Before deploying containers, let&apos;s understand how everything connects.</p><p>Our monitoring stack consists of three primary components.</p><h3 id="prometheus-%E2%80%94-the-metrics-engine">Prometheus &#x2014; The Metrics Engine</h3><p>Prometheus is an open-source monitoring and time-series database.</p><p>It periodically collects metrics from configured endpoints using an HTTP-based pull model.</p><p>Think of Prometheus as the engine responsible for collecting and storing infrastructure performance data.</p><p>For example:</p><pre><code>node_cpu_seconds_total</code></pre><p>This metric tracks the cumulative CPU time spent in different operating modes.</p><h3 id="node-exporter-%E2%80%94-the-infrastructure-sensor">Node Exporter &#x2014; The Infrastructure Sensor</h3><p>Node Exporter exposes Linux operating-system metrics, including:</p><ul><li>CPU utilization</li><li>Memory availability</li><li>Filesystem usage</li><li>Disk I/O</li><li>Network traffic</li><li>System uptime</li></ul><p>It exposes these metrics through an HTTP endpoint, normally on port <code>9100</code>.</p><h3 id="grafana-%E2%80%94-the-visualization-layer">Grafana &#x2014; The Visualization Layer</h3><p>Grafana transforms raw metrics into meaningful dashboards.</p><p>Instead of manually analyzing thousands of metrics, you can visualize your infrastructure using interactive charts, gauges, and time-series graphs.</p><p><strong>Our monitoring architecture:</strong></p><pre><code>              LINUX DOCKER HOST
                      |
                      |
               Node Exporter
                  Port 9100
                      |
                      | HTTP Metrics
                      v
                 Prometheus
                  Port 9090
                      |
                      | PromQL Queries
                      v
                   Grafana
                  Port 3000
                      |
                      v
             Infrastructure Dashboard
                      |
          +-----------+-----------+
          |           |           |
         CPU        Memory       Disk
          |           |           |
          +-----------+-----------+
                      |
               System Visibility</code></pre><p><strong>Important concept:</strong> Grafana queries Prometheus for metrics. Prometheus scrapes Node Exporter, while Node Exporter collects metrics from the Linux host.</p><p>This separation makes the architecture scalable and relatively easy to maintain.</p><hr><h2 id="2-prerequisites">2. Prerequisites</h2><p>For this tutorial, we&apos;ll use a Linux server with Docker installed.</p><p><strong>Recommended lab specifications:</strong></p>
<!--kg-card-begin: html-->
<table><thead><tr><th><span>Component</span></th><th><span>Recommendation</span></th></tr></thead><tbody><tr><td><span>Operating System</span></td><td><span>Ubuntu 22.04/24.04 or compatible Linux</span></td></tr><tr><td><span>CPU</span></td><td><span>2 vCPU</span></td></tr><tr><td><span>RAM</span></td><td><span>4 GB</span></td></tr><tr><td><span>Storage</span></td><td><span>20 GB</span></td></tr><tr><td><span>Docker</span></td><td><span>Recent Docker Engine</span></td></tr><tr><td><span>Docker Compose</span></td><td><span>Docker Compose v2</span></td></tr><tr><td><span>Prometheus</span></td><td><span>Port 9090</span></td></tr><tr><td><span>Grafana</span></td><td><span>Port 3000</span></td></tr><tr><td><span>Node Exporter</span></td><td><span>Port 9100</span></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>These specifications are suitable for a small lab. Production sizing depends on the number of monitored targets, metric cardinality, scrape intervals, and retention requirements.</p><h3 id="verify-docker">Verify Docker</h3><p>Run:</p><pre><code>docker --version
docker compose version</code></pre><p>If Docker isn&apos;t installed, follow the official Docker Engine installation instructions for your Linux distribution.</p><hr><h2 id="3-create-the-monitoring-project">3. Create the Monitoring Project</h2><p>We&apos;ll organize our monitoring environment using a simple directory structure.</p><pre><code>sudo mkdir -p /opt/monitoring/{prometheus,grafana/provisioning/datasources}

cd /opt/monitoring</code></pre><p>Our project structure will look like this:</p><pre><code>/opt/monitoring/
&#x2502;
&#x251C;&#x2500;&#x2500; docker-compose.yml
&#x2502;
&#x251C;&#x2500;&#x2500; prometheus/
&#x2502;   &#x2514;&#x2500;&#x2500; prometheus.yml
&#x2502;
&#x2514;&#x2500;&#x2500; grafana/
    &#x2514;&#x2500;&#x2500; provisioning/
        &#x2514;&#x2500;&#x2500; datasources/
            &#x2514;&#x2500;&#x2500; prometheus.yml</code></pre><p>Keeping configurations separate from the container definitions makes the deployment easier to maintain.</p><p>It also allows us to version-control configuration changes using Git.</p><hr><h2 id="4-deploy-prometheus-grafana-and-node-exporter">4. Deploy Prometheus, Grafana, and Node Exporter</h2><p>Create the Docker Compose file:</p><pre><code>nano docker-compose.yml</code></pre><p>Add the following configuration:</p><pre><code>services:

  prometheus:
    image: prom/prometheus:v3.7.0
    container_name: prometheus
    restart: unless-stopped

    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --storage.tsdb.retention.time=15d

    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus_data:/prometheus

    ports:
      - &quot;127.0.0.1:9090:9090&quot;

    networks:
      - monitoring

  node-exporter:
    image: prom/node-exporter:v1.9.1
    container_name: node-exporter
    restart: unless-stopped

    command:
      - --path.rootfs=/host
      - --path.procfs=/host/proc
      - --path.sysfs=/host/sys

    volumes:
      - /:/host:ro,rslave

    pid: host

    networks:
      - monitoring

  grafana:
    image: grafana/grafana:12.2.0
    container_name: grafana
    restart: unless-stopped

    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:?Set GRAFANA_ADMIN_PASSWORD}

    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro

    ports:
      - &quot;127.0.0.1:3000:3000&quot;

    depends_on:
      - prometheus

    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

volumes:
  prometheus_data:
  grafana_data:</code></pre><p><strong>Why use Docker volumes?</strong></p><p>Both Prometheus and Grafana store important data.</p><p>Prometheus maintains historical metrics, while Grafana stores dashboards, users, and other application settings.</p><p>Named Docker volumes preserve this data when containers are recreated.</p><p><strong>Security note:</strong> This example binds the web interfaces to localhost rather than exposing them publicly. For remote access, use an SSH tunnel or an authenticated HTTPS reverse proxy. In production, pin images to tested versions or immutable digests and upgrade them deliberately.</p><h3 id="configure-grafana-credentials">Configure Grafana credentials</h3><p>Create a <code>.env</code> file:</p><pre><code>nano .env</code></pre><p>Add:</p><pre><code>GRAFANA_ADMIN_PASSWORD=replace-with-a-strong-unique-password</code></pre><p>Protect the file:</p><pre><code>chmod 600 .env</code></pre><p>Do not commit this file to Git.</p><hr><h2 id="5-configure-prometheus">5. Configure Prometheus</h2><p>Create the configuration file:</p><pre><code>nano prometheus/prometheus.yml</code></pre><p>Add:</p><pre><code>global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:

  - job_name: prometheus
    static_configs:
      - targets:
          - prometheus:9090

  - job_name: linux-servers
    static_configs:
      - targets:
          - node-exporter:9100
        labels:
          environment: lab
          team: infrastructure</code></pre><h3 id="understanding-the-configuration">Understanding the configuration</h3><p>The <code>scrape_interval</code> determines how frequently Prometheus collects metrics.</p><p>In our example, metrics are collected every 15 seconds.</p><p>The <code>job_name</code> identifies a group of monitoring targets.</p><p>The <code>targets</code> parameter defines which endpoints Prometheus should scrape.</p><p>Because our containers share the same Docker network, they can communicate using their service names.</p><p>For example:</p><pre><code>node-exporter:9100</code></pre><p>Prometheus resolves this hostname through Docker&apos;s internal DNS.</p><p>We don&apos;t need to hardcode container IP addresses.</p><h3 id="validate-the-configuration">Validate the configuration</h3><p>Run:</p><pre><code>docker compose config</code></pre><p>This checks the Compose configuration.</p><p>After deployment, you can also validate the Prometheus configuration using:</p><pre><code>docker exec prometheus \
  promtool check config /etc/prometheus/prometheus.yml</code></pre><hr><h2 id="6-automatically-configure-the-grafana-data-source">6. Automatically Configure the Grafana Data Source</h2><p>Rather than manually adding Prometheus through the Grafana interface, we&apos;ll use <strong>Grafana provisioning</strong>.</p><p>Create:</p><pre><code>nano grafana/provisioning/datasources/prometheus.yml</code></pre><p>Add:</p><pre><code>apiVersion: 1

datasources:
  - name: Prometheus
    uid: prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: true</code></pre><p>This configuration automatically registers Prometheus as Grafana&apos;s default data source.</p><p>The URL is:</p><pre><code>http://prometheus:9090</code></pre><p>Notice that we are not using <code>localhost</code>.</p><p>Inside the Grafana container, <code>localhost</code> refers to Grafana&apos;s own container, not the Prometheus container.</p><p>This is one of the most common configuration mistakes when deploying containerized monitoring stacks.</p><hr><h2 id="7-start-the-monitoring-stack">7. Start the Monitoring Stack</h2><p>Now comes the exciting part.</p><p>From <code>/opt/monitoring</code>, execute:</p><pre><code>docker compose up -d</code></pre><p>Docker will download the required images and create the monitoring containers.</p><p>Verify their status:</p><pre><code>docker compose ps</code></pre><p>Expected output:</p><pre><code>NAME            STATUS
grafana         Up
prometheus      Up
node-exporter   Up</code></pre><h3 id="verify-prometheus">Verify Prometheus</h3><p>Open:</p><pre><code>http://localhost:9090</code></pre><p>If accessing the server remotely, create an SSH tunnel:</p><pre><code>ssh -L 9090:127.0.0.1:9090 \
    -L 3000:127.0.0.1:3000 \
    user@your-server</code></pre><p>Then visit the URLs from your local computer.</p><p>In Prometheus, navigate to:</p><p><strong>Status &#x2192; Target health</strong></p><p>You should see two monitoring jobs:</p><pre><code>prometheus       UP
linux-servers    UP</code></pre><p>The <code>UP</code> status confirms that Prometheus can successfully scrape the configured endpoints.</p><h3 id="verify-grafana">Verify Grafana</h3><p>Open:</p><pre><code>http://localhost:3000</code></pre><p>Log in using:</p><pre><code>Username: admin
Password: &lt;your configured password&gt;</code></pre><p>Grafana is now connected to Prometheus.</p><p><strong>Congratulations! Your Docker monitoring stack is operational.</strong></p>]]></content:encoded></item><item><title><![CDATA[Step-by-Step Guide: Installing VMware ESXi 7.0 from Scratch]]></title><description><![CDATA[<p>Build your own virtualization lab with VMware ESXi 7.0</p><hr><h2 id="introduction">Introduction</h2><p>VMware ESXi 7.0 is a Type-1 (bare-metal) hypervisor that allows you to run multiple virtual machines on a single physical server. Whether you&apos;re building a home lab, preparing for VMware certification, or deploying virtualization in production,</p>]]></description><link>https://blog.mutiangpili.com/vmware-esxi-7/</link><guid isPermaLink="false">6a62ab106220cf035f3fc337</guid><category><![CDATA[vmware]]></category><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Fri, 24 Jul 2026 07:56:24 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/07/1e915873-4754-45a7-987f-973c436807cb.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/07/1e915873-4754-45a7-987f-973c436807cb.png" alt="Step-by-Step Guide: Installing VMware ESXi 7.0 from Scratch"><p>Build your own virtualization lab with VMware ESXi 7.0</p><hr><h2 id="introduction">Introduction</h2><p>VMware ESXi 7.0 is a Type-1 (bare-metal) hypervisor that allows you to run multiple virtual machines on a single physical server. Whether you&apos;re building a home lab, preparing for VMware certification, or deploying virtualization in production, ESXi remains one of the industry&apos;s leading hypervisors.</p><p>In this guide, we&apos;ll walk through the complete installation process&#x2014;from downloading the installer to accessing the ESXi web interface.</p><hr><h1 id="prerequisites">Prerequisites</h1><p>Before starting, make sure you have the following:</p><h3 id="hardware-requirements">Hardware Requirements</h3>
<!--kg-card-begin: html-->
<table data-start="683" data-end="936" class="w-fit min-w-(--thread-content-width)"><thead data-start="683" data-end="720"><tr data-start="683" data-end="720"><th data-start="683" data-end="695" data-col-size="sm" class="last:pe-10">Component</th><th data-start="695" data-end="705" data-col-size="sm" class="last:pe-10">Minimum</th><th data-start="705" data-end="720" data-col-size="sm" class="last:pe-10">Recommended</th></tr></thead><tbody data-start="760" data-end="936"><tr data-start="760" data-end="818"><td data-start="760" data-end="766" data-col-size="sm">CPU</td><td data-start="766" data-end="784" data-col-size="sm">64-bit, 2 cores</td><td data-col-size="sm" data-start="784" data-end="818">Intel Xeon / AMD EPYC or Ryzen</td></tr><tr data-start="819" data-end="849"><td data-start="819" data-end="825" data-col-size="sm">RAM</td><td data-col-size="sm" data-start="825" data-end="832">4 GB</td><td data-col-size="sm" data-start="832" data-end="849">16 GB or more</td></tr><tr data-start="850" data-end="887"><td data-start="850" data-end="860" data-col-size="sm">Storage</td><td data-start="860" data-end="872" data-col-size="sm">32 GB SSD</td><td data-col-size="sm" data-start="872" data-end="887">120 GB+ SSD</td></tr><tr data-start="888" data-end="936"><td data-start="888" data-end="898" data-col-size="sm">Network</td><td data-col-size="sm" data-start="898" data-end="916">1 Supported NIC</td><td data-col-size="sm" data-start="916" data-end="936">Intel Server NIC</td></tr></tbody></table>
<!--kg-card-end: html-->
<p><strong>Tip:</strong> ESXi 7.0 works best when installed on SSD or NVMe storage. VMware recommends avoiding low-end USB or SD card boot devices for new installations because of increased write activity in ESXi 7.0.</p><hr><h1 id="what-youll-need">What You&apos;ll Need</h1><ul><li>VMware ESXi 7.0 ISO</li><li>USB Flash Drive (8GB or larger)</li><li>Rufus (Windows) or Balena Etcher</li><li>Physical Server or Compatible PC</li><li>Keyboard and Monitor (or iLO/iDRAC/IPMI)</li></ul><hr><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://blog.mutiangpili.com/content/media/2026/07/esxi7_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://blog.mutiangpili.com/content/media/2026/07/esxi7.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://blog.mutiangpili.com/content/media/2026/07/esxi7_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">10:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate">1&#xD7;</button>
                        <button class="kg-video-unmute-icon">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p dir="ltr"><a href="https://www.youtube.com/watch?v=uqyBrI2YoDQ&amp;ref=blog.mutiangpili.com"><span style="white-space: pre-wrap;">https://www.youtube.com/watch?v=uqyBrI2YoDQ</span></a></p></figcaption>
        </figure><hr><h1 id="step-1-%E2%80%93-download-vmware-esxi-70">Step 1 &#x2013; Download VMware ESXi 7.0</h1><p>Download the ESXi 7.0 ISO from the Broadcom Support Portal.</p><p>Make sure you download the version that matches your hardware vendor if available (Dell, HPE, Lenovo, Cisco, etc.).</p><p>Vendor-customized ISOs include optimized drivers for your hardware.</p><hr><h1 id="step-2-%E2%80%93-create-a-bootable-usb">Step 2 &#x2013; Create a Bootable USB</h1><p>Using Rufus:</p><ol><li>Insert your USB drive.</li><li>Open Rufus.</li><li>Select the ESXi ISO.</li><li>Partition Scheme:<ul><li>MBR (Legacy BIOS)</li><li>GPT (UEFI)</li></ul></li><li>Click <strong>Start</strong>.</li></ol><p>After completion, safely eject the USB.</p><hr><h1 id="step-3-%E2%80%93-configure-bios">Step 3 &#x2013; Configure BIOS</h1><p>Enter the server BIOS.</p><p>Enable:</p><ul><li>Intel VT-x or AMD-V</li><li>Intel VT-d (optional)</li><li>UEFI Boot (recommended)</li><li>Disable Secure Boot if unsupported</li></ul><p>Set the USB drive as the first boot device.</p><p>Save and reboot.</p><hr><h1 id="step-4-%E2%80%93-boot-the-esxi-installer">Step 4 &#x2013; Boot the ESXi Installer</h1><p>After booting from USB, you&apos;ll see:</p><pre><code>Loading VMware ESXi Installer...</code></pre><p>Wait a few moments.</p><p>The installer will initialize the hardware.</p><hr><h1 id="step-5-%E2%80%93-start-installation">Step 5 &#x2013; Start Installation</h1><p>When prompted:</p><pre><code>Welcome to VMware ESXi 7.0 Installer</code></pre><p>Press</p><pre><code>ENTER</code></pre><p>to continue.</p><hr><h1 id="step-6-%E2%80%93-accept-the-license-agreement">Step 6 &#x2013; Accept the License Agreement</h1><p>Read the EULA.</p><p>Press</p><pre><code>F11</code></pre><p>to accept.</p><hr><h1 id="step-7-%E2%80%93-select-installation-disk">Step 7 &#x2013; Select Installation Disk</h1><p>The installer detects available storage devices.</p><p>Example:</p><pre><code>Samsung SSD 870 EVO
120 GB

Kingston NVMe
500 GB</code></pre><p>Choose the drive where ESXi will be installed.</p><p>Press:</p><pre><code>ENTER</code></pre><hr><h1 id="step-8-%E2%80%93-select-keyboard-layout">Step 8 &#x2013; Select Keyboard Layout</h1><p>Usually:</p><pre><code>US Default</code></pre><p>Press Enter.</p><hr><h1 id="step-9-%E2%80%93-create-the-root-password">Step 9 &#x2013; Create the Root Password</h1><p>Create a strong password.</p><p>Example:</p><pre><code>Username:
root

Password:
************</code></pre><p>Requirements:</p><ul><li>8+ characters</li><li>Uppercase</li><li>Lowercase</li><li>Number</li><li>Symbol</li></ul><p>Press Enter.</p><hr><h1 id="step-10-%E2%80%93-confirm-installation">Step 10 &#x2013; Confirm Installation</h1><p>The installer warns that the selected disk will be erased.</p><p>Press:</p><pre><code>F11</code></pre><p>Installation begins.</p><p>Usually takes:</p><p>5&#x2013;10 minutes.</p><hr><h1 id="step-11-%E2%80%93-reboot">Step 11 &#x2013; Reboot</h1><p>When installation completes:</p><pre><code>Installation Complete

Remove Installation Media

Press ENTER to Reboot</code></pre><p>Remove the USB installer.</p><p>Press Enter.</p><hr><h1 id="step-12-%E2%80%93-first-boot">Step 12 &#x2013; First Boot</h1><p>ESXi loads.</p><p>Eventually you&apos;ll reach the Direct Console User Interface (DCUI).</p><p>Example:</p><pre><code>VMware ESXi 7.0

Press F2 to Customize</code></pre><p>You&apos;ll also see a DHCP-assigned IP address if one is available.</p><hr><h1 id="step-13-%E2%80%93-configure-the-management-network">Step 13 &#x2013; Configure the Management Network</h1><p>Press:</p><pre><code>F2</code></pre><p>Login:</p><pre><code>Username:
root

Password:
********</code></pre><p>Navigate to:</p><pre><code>Configure Management Network</code></pre><hr><h2 id="configure-network-adapter">Configure Network Adapter</h2><p>Select:</p><pre><code>Network Adapters</code></pre><p>Choose the physical NIC connected to your network.</p><hr><h2 id="configure-ipv4">Configure IPv4</h2><p>Navigate:</p><pre><code>IPv4 Configuration</code></pre><p>Select:</p><pre><code>Static IPv4</code></pre><p>Example:</p><pre><code>IP:
192.168.0.20

Subnet:
255.255.255.0

Gateway:
192.168.0.1</code></pre><hr><h2 id="configure-dns">Configure DNS</h2><pre><code>Primary DNS:
8.8.8.8

Secondary DNS:
1.1.1.1

Hostname:
esxi01</code></pre><hr><h2 id="restart-management-network">Restart Management Network</h2><p>Press:</p><pre><code>ESC</code></pre><p>Choose:</p><pre><code>Yes</code></pre><p>The Management Network restarts.</p><hr><h1 id="step-14-%E2%80%93-access-the-web-interface">Step 14 &#x2013; Access the Web Interface</h1><p>From another computer, open:</p><pre><code>https://192.168.0.20</code></pre><p>Ignore the SSL warning.</p><p>Login:</p><pre><code>Username:
root

Password:
********</code></pre><p>You&apos;ll now access the ESXi Host Client.</p><hr><h1 id="step-15-%E2%80%93-create-a-datastore">Step 15 &#x2013; Create a Datastore</h1><p>Navigate:</p><pre><code>Storage</code></pre><p>If a datastore wasn&apos;t created automatically:</p><pre><code>New Datastore</code></pre><p>Choose:</p><ul><li>VMFS 6</li><li>Entire Disk</li></ul><p>Finish.</p><hr><h1 id="step-16-%E2%80%93-configure-licensing">Step 16 &#x2013; Configure Licensing</h1><p>Navigate:</p><pre><code>Host

Manage

Licensing</code></pre><p>Choose:</p><pre><code>Assign License</code></pre><p>Enter your VMware license key.</p><p>If you don&apos;t have one, ESXi runs in Evaluation Mode for 60 days.</p><hr><h1 id="step-17-%E2%80%93-upload-iso-files">Step 17 &#x2013; Upload ISO Files</h1><p>Navigate:</p><pre><code>Storage

Datastore Browser</code></pre><p>Create folders:</p><pre><code>ISO

Templates

VMs</code></pre><p>Upload:</p><ul><li>Windows ISO</li><li>Ubuntu ISO</li><li>Rocky Linux</li><li>VMware Tools</li></ul><hr><h1 id="step-18-%E2%80%93-create-your-first-virtual-machine">Step 18 &#x2013; Create Your First Virtual Machine</h1><p>Click:</p><pre><code>Virtual Machines

Create/Register VM</code></pre><p>Select:</p><pre><code>Create New VM</code></pre><p>Example:</p><pre><code>Name:
Ubuntu01

Guest OS:
Ubuntu Linux 64-bit

CPU:
2

Memory:
4096 MB

Disk:
40 GB</code></pre><p>Attach the ISO.</p><p>Power it on.</p><hr><h1 id="recommended-post-installation-tasks">Recommended Post-Installation Tasks</h1><ul><li>Configure NTP</li><li>Enable SSH (only when needed)</li><li>Configure DNS</li><li>Configure Hostname</li><li>Create VM Network Port Groups</li><li>Configure VLANs</li><li>Set Power Policy to High Performance</li><li>Configure Local Users and Roles</li><li>Enable Lockdown Mode (production)</li><li>Configure Backups</li><li>Install VMware Tools on guest VMs</li><li>Monitor host health</li></ul><hr><h1 id="troubleshooting">Troubleshooting</h1><h3 id="no-compatible-network-adapter-found">No Compatible Network Adapter Found</h3><p>Cause:<br>Unsupported NIC.</p><p>Solution:</p><ul><li>Verify your hardware against the VMware Compatibility Guide.</li><li>Use a vendor-customized ESXi ISO with the appropriate network drivers.</li></ul><hr><h3 id="no-storage-devices-found">No Storage Devices Found</h3><p>Possible causes:</p><ul><li>RAID controller not configured</li><li>Unsupported storage controller</li><li>NVMe driver issue</li></ul><p>Check BIOS and RAID settings before reinstalling.</p><hr><h3 id="cannot-access-web-ui">Cannot Access Web UI</h3><p>Verify:</p><ul><li>Static IP</li><li>Gateway</li><li>DNS</li><li>Network cable</li><li>Firewall</li><li>HTTPS (port 443)</li></ul><p>Test connectivity:</p><pre><code>ping 192.168.0.20</code></pre><hr><h3 id="purple-screen-of-death-psod">Purple Screen of Death (PSOD)</h3><p>Common causes:</p><ul><li>Unsupported CPU</li><li>Faulty RAM</li><li>Driver incompatibility</li><li>Hardware failure</li></ul><p>Check server logs and firmware versions.</p><hr><h1 id="best-practices">Best Practices</h1><ul><li>Use SSD or NVMe for the ESXi boot device.</li><li>Keep firmware and drivers updated.</li><li>Use static IP addresses for management.</li><li>Back up the ESXi host configuration regularly.</li><li>Install vendor-customized ESXi images when available.</li><li>Use NTP to keep host time synchronized.</li><li>Store ISO files on a dedicated datastore.</li><li>Avoid enabling SSH permanently in production.</li></ul><hr><h1 id="conclusion">Conclusion</h1><p>Installing VMware ESXi 7.0 is a straightforward process that provides a powerful foundation for virtualization. After installation, you can begin deploying virtual machines, configuring networking and storage, and building a home lab or production environment.</p><p>Whether you&apos;re preparing for VMware certification, building a personal lab, or deploying enterprise infrastructure, mastering ESXi installation is the first step toward becoming proficient with VMware vSphere.</p>]]></content:encoded></item><item><title><![CDATA[Stop Managing Multiple Proxmox Clusters the Hard Way — Meet Proxmox Datacenter Manager]]></title><description><![CDATA[<p><em>Discover how Proxmox Datacenter Manager (PDM) provides a centralized dashboard, unified monitoring, VM migration, and simplified management across all your Proxmox clusters from a single interface.</em></p><p>As virtualization environments continue to grow, managing multiple hypervisors and clusters becomes increasingly complex. While Proxmox VE has always been an excellent open-source virtualization</p>]]></description><link>https://blog.mutiangpili.com/pdcm/</link><guid isPermaLink="false">6a3dbc9f1af2d8035273aa48</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Thu, 25 Jun 2026 23:57:47 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/06/ProxmoxDCM-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/06/ProxmoxDCM-1.png" alt="Stop Managing Multiple Proxmox Clusters the Hard Way &#x2014; Meet Proxmox Datacenter Manager"><p><em>Discover how Proxmox Datacenter Manager (PDM) provides a centralized dashboard, unified monitoring, VM migration, and simplified management across all your Proxmox clusters from a single interface.</em></p><p>As virtualization environments continue to grow, managing multiple hypervisors and clusters becomes increasingly complex. While Proxmox VE has always been an excellent open-source virtualization platform, administrators have often needed to switch between multiple web interfaces to manage different clusters.</p><p>This is where <strong>Proxmox Data Center Manager (PDM)</strong> comes in.</p><hr><h3 id="what-is-proxmox-data-center-manager">What is Proxmox Data Center Manager?</h3><p>Proxmox Data Center Manager (PDM) is a centralized management platform designed to manage multiple Proxmox Virtual Environment (PVE) clusters from a single interface.</p><p>Instead of logging into each individual Proxmox cluster, administrators can register multiple clusters into PDM and gain a unified view of their entire virtualization infrastructure.</p><p>Think of it as a <strong>single pane of glass</strong> for your Proxmox environment.</p><hr><h3 id="why-do-we-need-pdm">Why Do We Need PDM?</h3><p>Many organizations eventually reach a point where one cluster is no longer enough.</p><p>You might have:</p><ul><li>Production Cluster</li><li>Development Cluster</li><li>Disaster Recovery Cluster</li><li>Edge Clusters</li><li>Branch Office Clusters</li><li>Lab Environment</li></ul><p>Without centralized management, administrators constantly switch between web interfaces, making monitoring and administration more difficult.</p><p>PDM simplifies this by bringing everything together.</p><hr><h3 id="key-features">Key Features</h3><h3 id="centralized-dashboard">Centralized Dashboard</h3><p>Monitor all registered Proxmox clusters from one dashboard.</p><p>You can quickly view:</p><ul><li>Cluster health</li><li>CPU utilization</li><li>Memory usage</li><li>Storage capacity</li><li>Node status</li><li>Virtual machines</li><li>Containers</li></ul><p>No more opening multiple browser tabs.</p><hr><h3 id="multi-cluster-management">Multi-Cluster Management</h3><p>PDM allows administrators to register multiple independent Proxmox clusters.</p><p>Example:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.mutiangpili.com/content/images/2026/06/image.png" class="kg-image" alt="Stop Managing Multiple Proxmox Clusters the Hard Way &#x2014; Meet Proxmox Datacenter Manager" loading="lazy" width="1910" height="887" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/06/image.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/06/image.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/06/image.png 1600w, https://blog.mutiangpili.com/content/images/2026/06/image.png 1910w" sizes="(min-width: 720px) 720px"><figcaption><i><em class="italic" style="white-space: pre-wrap;">Single Pane of Glass</em></i></figcaption></figure><p>Everything becomes accessible from one portal.</p><hr><h3 id="unified-inventory">Unified Inventory</h3><p>Quickly locate resources across all clusters.</p><p>Search for:</p><ul><li>Virtual Machines</li><li>Containers</li><li>Storage</li><li>Nodes</li><li>Networks</li></ul><p>Instead of remembering which cluster hosts a particular VM, simply search for it.</p><hr><h3 id="role-based-access-control-rbac">Role-Based Access Control (RBAC)</h3><p>PDM integrates with the existing Proxmox permission model.</p><p>You can assign users different roles, such as:</p><ul><li>Infrastructure Administrators</li><li>Virtualization Team</li><li>Network Team</li><li>Backup Team</li><li>Read-Only Auditors</li></ul><p>This improves security while maintaining operational flexibility.</p><hr><h3 id="monitoring-and-alerts">Monitoring and Alerts</h3><p>PDM provides visibility into infrastructure health.</p><p>Examples include:</p><ul><li>Offline nodes</li><li>High CPU usage</li><li>Storage nearing capacity</li><li>Memory exhaustion</li><li>Cluster warnings</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.mutiangpili.com/content/images/2026/06/image-1.png" class="kg-image" alt="Stop Managing Multiple Proxmox Clusters the Hard Way &#x2014; Meet Proxmox Datacenter Manager" loading="lazy" width="1626" height="826" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/06/image-1.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/06/image-1.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/06/image-1.png 1600w, https://blog.mutiangpili.com/content/images/2026/06/image-1.png 1626w" sizes="(min-width: 720px) 720px"><figcaption><i><em class="italic" style="white-space: pre-wrap;">One Dashboard. Total Control.</em></i></figcaption></figure><p>This enables administrators to identify issues before they affect production workloads.</p><hr><h3 id="typical-architecture">Typical Architecture</h3><p>PDM acts as the management layer while each Proxmox cluster continues to operate independently.<br></p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/06/pdcm.png" class="kg-image" alt="Stop Managing Multiple Proxmox Clusters the Hard Way &#x2014; Meet Proxmox Datacenter Manager" loading="lazy" width="1536" height="1024" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/06/pdcm.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/06/pdcm.png 1000w, https://blog.mutiangpili.com/content/images/2026/06/pdcm.png 1536w" sizes="(min-width: 720px) 720px"></figure><hr><h3 id="things-to-keep-in-mind">Things to Keep in Mind</h3><p>While PDM simplifies management, it does <strong>not</strong> replace Proxmox VE. Your clusters remain independent, and workloads continue to run on their respective nodes. PDM serves as the centralized management and visibility layer.</p><p>For organizations with a single small cluster, PDM may not provide significant advantages. However, as your infrastructure grows, centralized management becomes increasingly valuable.</p><hr><h3 id="final-thoughts">Final Thoughts</h3><p>Proxmox Data Center Manager represents an important step forward for organizations adopting Proxmox at scale. By providing centralized visibility, simplified administration, and multi-cluster management, it reduces operational complexity while improving efficiency.</p><p>Whether you&apos;re running a home lab with multiple clusters or managing enterprise virtualization across several data centers, PDM offers a modern approach to infrastructure management that aligns with the needs of today&apos;s distributed environments.</p><p>As Proxmox continues to evolve, tools like PDM make it easier for IT teams to scale confidently without sacrificing simplicity.</p>]]></content:encoded></item><item><title><![CDATA[Why Proxmox VE 9.2.2 is the Smart Choice for Business Owners, IT Leaders, and Modern Infrastructure Teams]]></title><description><![CDATA[<p><em>Reduce Downtime, Improve Business Continuity, and Lower Virtualization Costs Without Compromising Enterprise Features</em></p><p>In today&apos;s digital landscape, businesses rely heavily on IT infrastructure to support daily operations, customer services, and business growth. Whether you&apos;re running a manufacturing company, retail business, professional services firm, or managed service</p>]]></description><link>https://blog.mutiangpili.com/pve/</link><guid isPermaLink="false">6a1d873ec4d82b033c15f529</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Mon, 01 Jun 2026 13:40:52 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/06/proxmox.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/06/proxmox.png" alt="Why Proxmox VE 9.2.2 is the Smart Choice for Business Owners, IT Leaders, and Modern Infrastructure Teams"><p><em>Reduce Downtime, Improve Business Continuity, and Lower Virtualization Costs Without Compromising Enterprise Features</em></p><p>In today&apos;s digital landscape, businesses rely heavily on IT infrastructure to support daily operations, customer services, and business growth. Whether you&apos;re running a manufacturing company, retail business, professional services firm, or managed service provider, downtime can directly impact productivity, customer satisfaction, and revenue.</p><p>For many business owners, the challenge is finding a virtualization platform that delivers enterprise-grade reliability without the high licensing costs often associated with traditional solutions.</p><p>This is where <strong>Proxmox VE 9.2.2</strong> stands out.</p><p>With built-in features such as <strong>High Availability (HA), Network Bonding, Storage Replication, and Node Affinity</strong>, Proxmox enables organizations to build resilient, scalable, and cost-effective infrastructure using standard hardware.</p><h3 id="what-is-proxmox-ve-922">What is Proxmox VE 9.2.2?</h3><p>Proxmox Virtual Environment (PVE) is an open-source enterprise virtualization platform that combines:</p><ul><li>KVM Virtual Machines</li><li>Linux Containers (LXC)</li><li>Clustering</li><li>Software Defined Storage</li><li>Backup and Recovery</li><li>High Availability</li><li>Centralized Management</li></ul><p>Unlike many commercial virtualization platforms, Proxmox provides enterprise capabilities without per-core or per-socket licensing costs.</p><p>For growing businesses, this means more budget can be invested in innovation, cybersecurity, and infrastructure improvements rather than software licensing.</p><hr><h3 id="high-availability-keeping-your-business-running">High Availability: Keeping Your Business Running</h3><p>Imagine your primary server suddenly fails during business hours.</p><p>Without High Availability:</p><p>&#x274C; Critical applications go offline</p><p>&#x274C; Employees cannot access systems</p><p>&#x274C; Customers may experience service interruptions</p><p>&#x274C; Revenue and productivity are impacted</p><p>With <strong>Proxmox High Availability</strong>, workloads are automatically restarted on another available node within the cluster.</p><h3 id="real-world-example">Real-World Example</h3><p>A business operates:</p><ul><li>ERP System</li><li>File Server</li><li>Active Directory</li><li>Accounting Application</li><li>Internal Web Applications</li></ul><p>across a three-node Proxmox cluster.</p><p>If one physical server experiences hardware failure:</p><ol><li>Proxmox detects the failure</li><li>HA Manager initiates recovery</li><li>Virtual machines restart on another node</li><li>Business operations continue with minimal disruption</li></ol><h3 id="business-benefits">Business Benefits</h3><p>&#x2714; Reduced downtime</p><p>&#x2714; Improved business continuity</p><p>&#x2714; Automated failover</p><p>&#x2714; Increased customer confidence</p><p>&#x2714; Reduced dependency on manual intervention</p><p>For small and medium-sized businesses, this provides enterprise-level protection without requiring a dedicated enterprise budget.</p><hr><h3 id="network-bonding-eliminating-single-points-of-failure">Network Bonding: Eliminating Single Points of Failure</h3><p>Many organizations invest heavily in servers but overlook one critical component: network redundancy.</p><p>A failed network cable or switch port can cause service interruptions even when servers remain operational.</p><p>Proxmox supports <strong>Network Bonding</strong>, allowing multiple physical network interfaces to function as a single logical connection.</p><h3 id="advantages">Advantages</h3><h3 id="redundancy">Redundancy</h3><p>If one network interface fails, traffic automatically continues through the remaining connection.</p><h3 id="increased-performance">Increased Performance</h3><p>Using LACP (802.3ad), organizations can aggregate multiple interfaces for higher throughput.</p><h3 id="better-cluster-reliability">Better Cluster Reliability</h3><p>Cluster communication remains stable even during network failures.</p><h3 id="improved-storage-replication">Improved Storage Replication</h3><p>Dedicated bonded links can be used for:</p><ul><li>Replication traffic</li><li>Backup traffic</li><li>Cluster synchronization</li></ul><p>The result is a more resilient infrastructure capable of supporting mission-critical workloads.</p><hr><h3 id="storage-replication-built-in-disaster-recovery">Storage Replication: Built-In Disaster Recovery</h3><p>Disaster recovery is often perceived as expensive and complex.</p><p>Proxmox changes this by including <strong>Storage Replication</strong> directly within the platform.</p><p>When using ZFS storage, virtual machine data can be replicated automatically between nodes at scheduled intervals.</p><p>Only changed blocks are transferred, making replication efficient and bandwidth-friendly.</p><h3 id="business-benefits-1">Business Benefits</h3><p>&#x2714; Faster recovery during hardware failures</p><p>&#x2714; Improved disaster preparedness</p><p>&#x2714; Reduced recovery time objectives (RTO)</p><p>&#x2714; No need for expensive SAN solutions</p><p>&#x2714; Lower infrastructure costs</p><p>For businesses that cannot justify enterprise storage arrays, Proxmox provides a practical and affordable alternative.</p><hr><h3 id="node-affinity-putting-workloads-where-they-belong">Node Affinity: Putting Workloads Where They Belong</h3><p>Not all workloads have the same requirements.</p><p>A database server may require:</p><ul><li>Faster CPUs</li><li>More RAM</li><li>NVMe storage</li></ul><p>while a file server may operate efficiently on standard infrastructure.</p><p><strong>Node Affinity</strong> allows administrators to define preferred locations for specific workloads.</p><h3 id="example-use-cases">Example Use Cases</h3><h3 id="database-workloads">Database Workloads</h3><p>Prioritize nodes with:</p><ul><li>High-performance NVMe storage</li><li>Larger memory capacity</li><li>Higher CPU resources</li></ul><h3 id="business-critical-applications">Business-Critical Applications</h3><p>Ensure important systems run on preferred hardware.</p><h3 id="compliance-requirements">Compliance Requirements</h3><p>Keep regulated workloads on designated infrastructure.</p><h3 id="performance-optimization">Performance Optimization</h3><p>Distribute workloads strategically across the cluster.</p><p>Node Affinity provides greater control over infrastructure resources while maintaining the flexibility of virtualization.</p><hr><h3 id="a-practical-smb-deployment-scenario">A Practical SMB Deployment Scenario</h3><p>Consider a growing business with:</p><h3 id="infrastructure">Infrastructure</h3>
<!--kg-card-begin: html-->
<table data-start="5682" data-end="5945" class="w-fit min-w-(--thread-content-width)"><thead data-start="5682" data-end="5711"><tr data-start="5682" data-end="5711"><th data-start="5682" data-end="5694" data-col-size="sm" class="last:pe-10">Component</th><th data-start="5694" data-end="5711" data-col-size="sm" class="last:pe-10">Configuration</th></tr></thead><tbody data-start="5743" data-end="5945"><tr data-start="5743" data-end="5764"><td data-start="5743" data-end="5759" data-col-size="sm">Cluster Nodes</td><td data-start="5759" data-end="5764" data-col-size="sm">3</td></tr><tr data-start="5765" data-end="5798"><td data-start="5765" data-end="5778" data-col-size="sm">Hypervisor</td><td data-start="5778" data-end="5798" data-col-size="sm">Proxmox VE 9.2.2</td></tr><tr data-start="5799" data-end="5821"><td data-start="5799" data-end="5809" data-col-size="sm">Storage</td><td data-start="5809" data-end="5821" data-col-size="sm">ZFS RAID</td></tr><tr data-start="5822" data-end="5847"><td data-start="5822" data-end="5832" data-col-size="sm">Network</td><td data-start="5832" data-end="5847" data-col-size="sm">Bonded 10Gb</td></tr><tr data-start="5848" data-end="5882"><td data-start="5848" data-end="5862" data-col-size="sm">Replication</td><td data-start="5862" data-end="5882" data-col-size="sm">Every 15 Minutes</td></tr><tr data-start="5883" data-end="5910"><td data-start="5883" data-end="5899" data-col-size="sm">HA Protection</td><td data-start="5899" data-end="5910" data-col-size="sm">Enabled</td></tr><tr data-start="5911" data-end="5945"><td data-start="5911" data-end="5920" data-col-size="sm">Backup</td><td data-start="5920" data-end="5945" data-col-size="sm">Proxmox Backup Server</td></tr></tbody></table>
<!--kg-card-end: html-->
<h3 id="what-happens-during-a-failure">What Happens During a Failure?</h3><p>If Node 1 experiences hardware failure:</p><ul><li>Replicated data already exists on Node 2</li><li>High Availability detects the outage</li><li>Protected workloads restart automatically</li><li>Business services remain available</li></ul><p>Instead of experiencing hours of downtime, recovery occurs automatically within minutes.</p><h3 id="why-proxmox-is-a-good-alternative">Why Proxmox is a Good Alternative</h3><p>Business owners increasingly expect IT investments to deliver measurable business value.</p><p>Proxmox helps achieve this through:</p><h3 id="lower-total-cost-of-ownership">Lower Total Cost of Ownership</h3><p>No expensive per-core licensing fees.</p><h3 id="improved-business-continuity">Improved Business Continuity</h3><p>Built-in High Availability and Replication reduce operational risk.</p><h3 id="scalability">Scalability</h3><p>Grow from a small cluster to enterprise-scale environments without redesigning infrastructure.</p><h3 id="vendor-independence">Vendor Independence</h3><p>Choose the hardware, storage, and networking vendors that best fit your business needs.</p><h3 id="investment-protection">Investment Protection</h3><p>Avoid vendor lock-in while maintaining enterprise functionality.</p><p>For organizations seeking long-term flexibility and cost control, this is a compelling advantage.</p><p></p><hr><h3 id="final-thoughts">Final Thoughts</h3><p>Proxmox VE 9.2.2 has evolved into a mature enterprise virtualization platform capable of supporting production workloads across a wide range of industries.</p><p>Its combination of:</p><ul><li>High Availability</li><li>Network Bonding</li><li>Storage Replication</li><li>Node Affinity</li><li>Live Migration</li><li>Enterprise Clustering</li></ul><p>allows organizations to build resilient infrastructure without the burden of excessive licensing costs.</p><p>For business owners, the benefits are clear:</p><p><strong>Less downtime. Lower costs. Greater flexibility. Better business continuity.</strong></p><p>Whether you&apos;re modernizing existing infrastructure, planning a virtualization refresh, or evaluating alternatives to traditional platforms, Proxmox VE 9.2.2 deserves a place on your shortlist.</p>]]></content:encoded></item><item><title><![CDATA[🏆 Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs]]></title><description><![CDATA[<hr><p>There was a time when scaling meant adding more VMs.</p><p>Traffic goes up? Add a server. CPU spikes? Resize the instance.</p><p>It worked&#x2026; for a while.</p><p>But eventually, it didn&#x2019;t.</p><p>More servers just meant more management. More maintenance. More complexity.</p><p>And even with extra capacity, the same</p>]]></description><link>https://blog.mutiangpili.com/aks/</link><guid isPermaLink="false">69ef07514d54aa035c5ec07f</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Mon, 27 Apr 2026 16:59:34 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1639322537228-f710d846310a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI4fHx0ZWNofGVufDB8fHx8MTc3NzIyODUyNXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<hr><img src="https://images.unsplash.com/photo-1639322537228-f710d846310a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI4fHx0ZWNofGVufDB8fHx8MTc3NzIyODUyNXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs"><p>There was a time when scaling meant adding more VMs.</p><p>Traffic goes up? Add a server. CPU spikes? Resize the instance.</p><p>It worked&#x2026; for a while.</p><p>But eventually, it didn&#x2019;t.</p><p>More servers just meant more management. More maintenance. More complexity.</p><p>And even with extra capacity, the same issues kept coming back.</p><p>That&#x2019;s when I realized something important.</p><p>The problem wasn&#x2019;t capacity.</p><p>It was architecture.</p><p>So instead of adding more machines, I changed the approach.</p><p>I  used the <strong>Azure Kubernetes Service</strong> &#x2014; not just to use Kubernetes, but to build a system that can adapt on its own.</p><hr><h2 id="%F0%9F%94%84-the-shift-from-servers-to-workloads">&#x1F504; The Shift: From Servers to Workloads</h2><p>Before AKS, my mindset was tied to infrastructure:</p><ul><li>Which VM is overloaded?</li><li>Do I need a bigger instance?</li><li>Should I spin up another server?</li></ul><p>After AKS, the questions changed:</p><ul><li>Is my application healthy?</li><li>Are my pods scaling properly?</li><li>Is traffic distributed efficiently?</li></ul><p>That shift alone changes how you design systems.</p><p>Because Kubernetes doesn&#x2019;t care about your servers.</p><p>It cares about <strong>desired state</strong>.</p><hr><h2 id="%F0%9F%A7%A0-what-aks-really-solves">&#x1F9E0; What AKS Really Solves</h2><p>With AKS, I stopped dealing with:</p><ul><li>Manual scaling</li><li>Load balancing configurations</li><li>Node lifecycle management</li></ul><p>Azure handles all of that.</p><p>Instead, I define:</p><ul><li>How much CPU a workload needs</li><li>When it should scale</li><li>How many instances should exist</li></ul><p>And the platform takes care of the rest.</p><hr><h2 id="%F0%9F%9B%A0%EF%B8%8F-the-build-simple-but-powerful">&#x1F6E0;&#xFE0F; The Build (Simple but Powerful)</h2><p>I kept the setup intentionally simple:</p><ul><li>1 AKS cluster</li><li>1 node pool (autoscaling enabled)</li><li>1 containerized app (<code>vtoxzy/webme</code>)</li><li>1 public LoadBalancer</li></ul><h3 id="create-aks-cluster">Create AKS Cluster<br></h3><h3 id="using-azure-gui">Using Azure GUI</h3><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-5.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="1320" height="772" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-5.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-5.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/image-5.png 1320w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-6.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="1530" height="1458" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-6.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-6.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/image-6.png 1530w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-9.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="1478" height="1198" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-9.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-9.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/image-9.png 1478w" sizes="(min-width: 720px) 720px"></figure><h3 id="using-cloud-shell-cli">Using Cloud Shell CLI</h3><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-text">az aks create \<br> --resource-group CW-EUS-SUB1 \<br> --name eus-aks-cluster \<br> --node-count 1 \<br> --enable-cluster-autoscaler \<br> --min-count 1 \<br> --max-count 3 \<br> --generate-ssh-keys</div></div><p>Start small. Let it grow when needed.</p><hr><h3 id="connect-to-aks">Connect to AKS</h3><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">az aks get-credentials \<br> --resource-group myRG \<br> --name myAKSCluster</div></div><hr><h3 id="managing-aks">Managing AKS</h3><p>Here are the primary commands I use to check status:</p><p><code>kubectl get nodes</code> &#x2014; to check the number of nodes and their status</p><p><code>kubectl get pods</code> &#x2014; to check pod status</p><p><code>kubectl get svc</code> &#x2014; to check running service</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-11.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="1390" height="484" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-11.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-11.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/image-11.png 1390w" sizes="(min-width: 720px) 720px"></figure><hr><h3 id="deploy-application">Deploy Application</h3><p>In Cloud Shell, create a YAML file.</p><ol><ol><ol><li>nano webme.yml</li></ol></ol></ol><p>Deploy the application.</p><ol><ol><ol><li>kubectl apply -f webme.yaml</li></ol></ol></ol><p>Verify the pods. </p><ol><ol><ol><li>kubectl get pods</li></ol></ol></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-12.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="1586" height="562" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-12.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-12.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/image-12.png 1586w" sizes="(min-width: 720px) 720px"></figure><p>Check the public IP in the web browser. </p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-13.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="2000" height="874" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-13.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-13.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/04/image-13.png 1600w, https://blog.mutiangpili.com/content/images/size/w2400/2026/04/image-13.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Add 10 pods. </p><ol><ol><ol><li>kubectl scale deployment webme-development --replicas=10</li></ol></ol></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-15.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="1674" height="564" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-15.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-15.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/04/image-15.png 1600w, https://blog.mutiangpili.com/content/images/2026/04/image-15.png 1674w" sizes="(min-width: 720px) 720px"></figure><hr><h2 id="%E2%9A%A1-where-it-gets-interesting-autoscaling">&#x26A1; Where It Gets Interesting: Autoscaling</h2><p>This is where AKS actually changes the game.</p><p>I enabled <strong>Horizontal Pod Autoscaler (HPA)</strong>:</p><p>kubectl autoscale deployment webme \<br>  --cpu-percent=50 \<br>  --min=1 \<br>  --max=5</p><p>Now the system behaves differently:</p><ul><li>CPU increases &#x2192; more pods spin up</li><li>CPU drops &#x2192; pods scale down</li></ul><p>No manual action.</p><p>No guessing.</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-16.png" class="kg-image" alt="&#x1F3C6; Built to Scale, Not to Break: How We Eliminated Bottlenecks Without Increasing Infrastructure Costs" loading="lazy" width="2000" height="1055" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-16.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-16.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/04/image-16.png 1600w, https://blog.mutiangpili.com/content/images/size/w2400/2026/04/image-16.png 2400w" sizes="(min-width: 720px) 720px"></figure><hr><h2 id="%F0%9F%92%A1-the-things-that-will-break-it">&#x1F4A1; The Things That Will Break It</h2><p>Kubernetes is powerful &#x2014; but it&#x2019;s not magic.</p><p>If you don&#x2019;t define things properly, nothing happens.</p><p>Here are the common mistakes:</p><ul><li>&#x274C; No CPU requests &#x2192; HPA won&#x2019;t trigger</li><li>&#x274C; Autoscaler disabled &#x2192; nodes won&#x2019;t scale</li><li>&#x274C; Pods still fit in existing nodes &#x2192; no scale-out</li></ul><p>The system follows rules. You just need to set them right.</p><hr><h2 id="%F0%9F%A7%B1-what-actually-changed">&#x1F9F1; What Actually Changed</h2><p>Before:</p><ul><li>Reactive operations</li><li>Manual scaling</li><li>Constant monitoring</li></ul><p>After:</p><ul><li>Automated scaling</li><li>Self-healing workloads</li><li>Predictable behavior under load</li></ul><p>And most importantly&#x2014;</p><p>Less time fixing infrastructure.<br>More time improving systems.</p><hr><h2 id="%F0%9F%8E%AF-final-thought">&#x1F3AF; Final Thought</h2><p>A lot of teams think scaling means adding more servers.</p><p>But that&#x2019;s just adding weight to the same problem.</p><p>Real scalability comes from systems that adjust themselves.</p><p>That&#x2019;s what <strong>Azure Kubernetes Service</strong> gives you.</p><p>Not just more capacity.</p><p>But <strong>control over behavior</strong>.</p><hr><h2 id="%F0%9F%8F%81-tldr">&#x1F3C1; TL;DR</h2><ul><li>Stop thinking in VMs</li><li>Start thinking in workloads</li><li>Enable autoscaling early</li><li>Define CPU requests properly</li><li>Let the platform do its job</li></ul><hr><p>If your infrastructure still depends on manual scaling&#x2026;</p><p>You&#x2019;re not scaling.</p><p>You&#x2019;re surviving.</p>]]></content:encoded></item><item><title><![CDATA[From 2AM Panic to Automated Calm: How Azure Autoscale Changed Everything]]></title><description><![CDATA[Azure AutoScale]]></description><link>https://blog.mutiangpili.com/azureautoscale/</link><guid isPermaLink="false">69ecb82d4d54aa035c5ec049</guid><category><![CDATA[AzureAutoscale]]></category><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sat, 25 Apr 2026 13:09:31 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/04/autoscale-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/04/autoscale-1.png" alt="From 2AM Panic to Automated Calm: How Azure Autoscale Changed Everything"><p>There&#x2019;s a moment every infrastructure engineer knows&#x2014;the one where everything is fine&#x2026; until it isn&#x2019;t.</p><p>For me, it happened at 2AM. CPU utilization shot up to 100%, alerts started firing non-stop, and users were quietly dropping off. I was inside <strong>Microsoft Azure</strong>, manually resizing virtual machines, trying to keep the system alive. It worked&#x2014;but barely. And more importantly, it wasn&#x2019;t sustainable.</p><p>That night made one thing very clear:<br><strong>The problem wasn&#x2019;t capacity. It was control.</strong></p><hr><h2 id="%F0%9F%94%B4-the-problem-reactive-infrastructure">&#x1F534; The Problem: Reactive Infrastructure</h2><p>Like many setups, I was running on fixed resources. During normal hours, everything was stable. But when demand spiked, the system had no way to adapt on its own.</p><p>That meant:</p><ul><li>Either overprovision (and waste money), or</li><li>Underprovision (and risk downtime)</li></ul><p>And when traffic surged, it always came down to one thing:<br><strong>How fast I could react.</strong></p><p>That&#x2019;s not how modern infrastructure should work.</p><hr><h2 id="%E2%9A%99%EF%B8%8F-the-architecture-simple-scalable-and-smart">&#x2699;&#xFE0F; The Architecture: Simple, Scalable, and Smart</h2><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/autoscale.png" class="kg-image" alt="From 2AM Panic to Automated Calm: How Azure Autoscale Changed Everything" loading="lazy" width="1536" height="1024" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/autoscale.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/autoscale.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/autoscale.png 1536w" sizes="(min-width: 720px) 720px"></figure><p>Instead of adding complexity, I simplified the design and focused on automation.</p><p>Here&#x2019;s the actual architecture I implemented:</p><p>Azure Autoscale Architecture</p><h3 id="%F0%9F%A7%B1-core-components">&#x1F9F1; Core Components</h3><ul><li><strong>Region:</strong> East US 2</li><li><strong>Virtual Network:</strong> <code>10.0.1.0/24</code></li><li><strong>NSG:</strong> Secured inbound/outbound traffic</li><li><strong>Availability Zone:</strong> Single zone (can expand to multi-zone)</li><li><strong>Compute:</strong> Virtual Machine Scale Set (VMSS)</li></ul><hr><h2 id="%E2%9A%99%EF%B8%8F-the-shift-letting-the-system-think">&#x2699;&#xFE0F; The Shift: Letting the System Think</h2><p>Instead of fighting the spikes, I redesigned the approach.</p><p>I implemented <strong>Azure Autoscale</strong> using a Virtual Machine Scale Set. The idea was simple:</p><ul><li>Minimum instances: 1</li><li>Maximum instances: 3</li><li>Scale out if CPU &gt; 80%</li><li>Scale in if CPU &lt; 30%</li></ul><p>No complex logic. Just clear thresholds based on real behavior.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-1.png" class="kg-image" alt="From 2AM Panic to Automated Calm: How Azure Autoscale Changed Everything" loading="lazy" width="2000" height="1061" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-1.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-1.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/04/image-1.png 1600w, https://blog.mutiangpili.com/content/images/size/w2400/2026/04/image-1.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Before Autoscale Trigger</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-2.png" class="kg-image" alt="From 2AM Panic to Automated Calm: How Azure Autoscale Changed Everything" loading="lazy" width="2000" height="1083" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-2.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-2.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/04/image-2.png 1600w, https://blog.mutiangpili.com/content/images/size/w2400/2026/04/image-2.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Scale-Out After AutoScale Trigger</span></figcaption></figure><p>To validate it, I simulated load using a simple Linux stress tool. As CPU usage climbed, I watched new instances spin up automatically. When the load dropped, the system scaled back down quietly.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.mutiangpili.com/content/images/2026/04/image-3.png" class="kg-image" alt="From 2AM Panic to Automated Calm: How Azure Autoscale Changed Everything" loading="lazy" width="2000" height="1051" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/image-3.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/image-3.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/04/image-3.png 1600w, https://blog.mutiangpili.com/content/images/size/w2400/2026/04/image-3.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Scale-In After CPU back to Normal</span></figcaption></figure><p>No clicks. No panic.<br>Just automation doing exactly what it was designed to do.</p><hr><h2 id="%F0%9F%92%A1-the-outcome-stability-without-stress">&#x1F4A1; The Outcome: Stability Without Stress</h2><p>That one change had an immediate impact.</p><p>Performance became consistent&#x2014;even under heavy load. Users no longer felt slowdowns. And instead of guessing how much capacity I needed, the system adjusted itself in real time.</p><p>But the biggest win wasn&#x2019;t technical.</p><p>It was operational.</p><ul><li>No more late-night firefighting</li><li>No more overpaying for idle resources</li><li>No more reactive decision-making</li></ul><p>For the first time, the infrastructure felt&#x2026; effortless.</p><hr><h2 id="%F0%9F%9A%80-why-autoscale-matters">&#x1F680; Why Autoscale Matters</h2><p>Autoscale isn&#x2019;t just about adding more servers&#x2014;it&#x2019;s about building systems that respond intelligently to demand.</p><p>Here&#x2019;s what it unlocks:</p><p><strong>Cost Efficiency</strong><br>You only pay for what you actually use.</p><p><strong>High Availability</strong><br>The system reacts faster than any human ever could.</p><p><strong>Performance Stability</strong><br>Traffic spikes are absorbed seamlessly.</p><p><strong>Operational Freedom</strong><br>You stop managing servers&#x2014;and start designing systems.</p><hr><h2 id="%F0%9F%8E%AF-final-thoughts">&#x1F3AF; Final Thoughts</h2><p>That night changed how I think about infrastructure.</p><p>Before, I was reacting to problems.<br>Now, the system prevents them.</p><p>With **Microsoft Azure Autoscale, you&#x2019;re not just scaling resources&#x2014;you&#x2019;re scaling your ability to operate efficiently, reliably, and intelligently.</p><p>And once you experience that shift&#x2026;</p><p>You&#x2019;ll never want to go back.</p>]]></content:encoded></item><item><title><![CDATA[🛜 I Stopped Using VPN Gateways—Here’s How I Built a Multi-Cloud Network Instead]]></title><description><![CDATA[<h2 id="%F0%9F%9A%80-building-a-low-cost-multi-cloud-network-with-tailscale-azure-aws-on-prem">&#x1F680; Building a Low-Cost Multi-Cloud Network with Tailscale (Azure + AWS + On-Prem)</h2><p></p><p>For years, the default way to connect networks across environments&#x2014;on-premises, Azure, AWS&#x2014;has been through traditional site-to-site VPNs. You deploy a VPN gateway, configure IPSec tunnels, manage pre-shared keys, deal with routing quirks, and pay a</p>]]></description><link>https://blog.mutiangpili.com/multi-cloud-tailscale/</link><guid isPermaLink="false">69eb61994d54aa035c5ebffb</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Fri, 24 Apr 2026 12:54:37 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1644088379091-d574269d422f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlY2hub2xvZ3l8ZW58MHx8fHwxNzc3MDM0MDE3fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%F0%9F%9A%80-building-a-low-cost-multi-cloud-network-with-tailscale-azure-aws-on-prem">&#x1F680; Building a Low-Cost Multi-Cloud Network with Tailscale (Azure + AWS + On-Prem)</h2><img src="https://images.unsplash.com/photo-1644088379091-d574269d422f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlY2hub2xvZ3l8ZW58MHx8fHwxNzc3MDM0MDE3fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="&#x1F6DC; I Stopped Using VPN Gateways&#x2014;Here&#x2019;s How I Built a Multi-Cloud Network Instead"><p></p><p>For years, the default way to connect networks across environments&#x2014;on-premises, Azure, AWS&#x2014;has been through traditional site-to-site VPNs. You deploy a VPN gateway, configure IPSec tunnels, manage pre-shared keys, deal with routing quirks, and pay a fixed monthly cost whether you use it heavily or not.</p><p>It works. But it&#x2019;s heavy, rigid, and for many small-to-medium businesses, unnecessarily expensive.</p><p>So I explored a different approach&#x2014;one that removes the dependency on traditional VPN gateways entirely. Instead of building tunnels between networks, I focused on building a <strong>secure, identity-based network overlay</strong> using Tailscale, and combining it with <strong>native cloud routing mechanisms like VNet peering and VPC peering</strong>.</p><p>What came out of that is a fully functional, multi-cloud network that behaves like a site-to-site VPN&#x2014;but is far more flexible and cost-efficient.</p><hr><h2 id="%F0%9F%A7%AD-architecture-at-a-glance">&#x1F9ED; Architecture at a Glance</h2><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/04/a50d0eb6-3c82-4c02-bd5a-490815f47727.png" class="kg-image" alt="&#x1F6DC; I Stopped Using VPN Gateways&#x2014;Here&#x2019;s How I Built a Multi-Cloud Network Instead" loading="lazy" width="1402" height="1122" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/04/a50d0eb6-3c82-4c02-bd5a-490815f47727.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/04/a50d0eb6-3c82-4c02-bd5a-490815f47727.png 1000w, https://blog.mutiangpili.com/content/images/2026/04/a50d0eb6-3c82-4c02-bd5a-490815f47727.png 1402w" sizes="(min-width: 720px) 720px"></figure><hr><h2 id="%F0%9F%8C%90-the-idea-don%E2%80%99t-tunnel-networks%E2%80%94overlay-them"><strong>&#x1F310; The Idea: Don&#x2019;t Tunnel Networks&#x2014;Overlay Them</strong></h2><p>At the core of this design is a simple shift in thinking.</p><p>Instead of asking:</p><p>&#x201C;How do I connect Site A to Site B with a tunnel?&#x201D;</p><p>We ask:</p><p>&#x201C;How do I make all sites part of the same secure network, regardless of where they live?&#x201D;</p><p>This is exactly what Tailscale does.</p><p>Tailscale creates a <strong>private mesh network</strong> across all participating nodes using WireGuard. Every node gets an identity and a private IP, and communication between nodes is encrypted end-to-end. There&#x2019;s no central VPN gateway, no single choke point&#x2014;just direct, secure connectivity between peers.</p><p>But the real power comes when you introduce <strong>subnet routers</strong>.</p><hr><h2 id="%F0%9F%94%91-turning-individual-nodes-into-network-gateways">&#x1F511; Turning Individual Nodes into Network Gateways</h2><p>In a normal Tailscale setup, only the devices running Tailscale can communicate. That&#x2019;s useful, but not enough when you want entire subnets&#x2014;like <code>192.168.0.0/24</code> or <code>10.0.1.0/24</code>&#x2014;to be reachable.</p><p>This is where subnet routers come in.</p><p>By enabling route advertisement on a node, you essentially tell Tailscale:</p><p>&#x201C;If anyone needs to reach this subnet, send the traffic to me.&#x201D;</p><p>For example, on an on-prem server:</p><p>tailscale up --advertise-routes=192.168.0.0/24</p><p>Now, any device in the Tailscale network can reach the entire on-prem subnet through that single node.</p><p>The same concept applies in the cloud.</p><ul><li>In Azure, a VM advertises <code>10.0.0.0/16</code></li><li>In AWS N. Virginia, another VM advertises <code>172.0.1.0/24</code></li></ul><p>These nodes stop being just servers&#x2014;they become <strong>routing points between the overlay network and their local environments</strong>.</p><p>But for this to work correctly, one critical setting must be enabled:</p><p>sysctl -w net.ipv4.ip_forward=1</p><p>Without IP forwarding, the node can receive traffic&#x2014;but won&#x2019;t pass it along.</p><hr><h2 id="%E2%98%81%EF%B8%8F-azure-acting-as-the-aggregation-layer">&#x2601;&#xFE0F; Azure: Acting as the Aggregation Layer</h2><p>In Azure, I used two VNets&#x2014;East US and Central US&#x2014;connected via VNet peering. This part is important because Azure peering provides <strong>high-speed, low-latency private connectivity</strong> between networks without needing a gateway.</p><p>Inside East US, I deployed a Tailscale router VM and advertised the Azure address space.</p><p>Now, Azure effectively becomes a <strong>hub</strong> in the design. It can reach:</p><ul><li>On-prem via Tailscale</li><li>AWS via Tailscale</li><li>Other Azure VNets via peering</li></ul><p>To make this work cleanly, Azure uses <strong>User Defined Routes (UDRs)</strong>.</p><p>For example:</p><p>Destination: 172.0.0.0/16  <br>Next hop: Tailscale router VM</p><p>This ensures that any traffic destined for AWS is forwarded into the Tailscale overlay instead of being dropped or sent to the internet.</p><p>At the same time, Network Security Groups (NSGs) must allow traffic from the AWS and on-prem CIDRs. Without that, packets arrive&#x2014;but never make it to the VM.</p><hr><h2 id="%E2%98%81%EF%B8%8F-aws-where-routing-gets-interesting">&#x2601;&#xFE0F; AWS: Where Routing Gets Interesting</h2><p>AWS introduces a key constraint that shapes the design:</p><p><strong>VPC peering is not transitive.</strong></p><p>This means AWS will not automatically route traffic from one VPC to another through a third VPC.</p><p>So if you have:</p><ul><li>N. Virginia (<code>172.0.1.0/24</code>)</li><li>Oregon (<code>172.0.2.0/24</code>)</li></ul><p>Even with peering in place, traffic won&#x2019;t magically flow across multiple hops.</p><p>To solve this, I used the N. Virginia Tailscale router as a <strong>controlled transit point</strong>.</p><p>Here&#x2019;s how it works in practice.</p><p>When Azure wants to reach a VM in Oregon:</p><ol><li>The packet is sent to the Azure Tailscale router (via UDR)</li><li>It enters the Tailscale network (encrypted)</li><li>It reaches the AWS N. Virginia router</li><li>That router checks its route table:172.0.2.0/24 &#x2192; VPC Peering (pcx-xxxx)</li><li>The packet is forwarded across the peering connection into Oregon</li></ol><p>The return path follows the same logic in reverse.</p><p>This works not because AWS allows transitive routing&#x2014;but because the N. Virginia router is acting as a <strong>Layer 3 forwarding device</strong>, making an explicit routing decision.</p><hr><h2 id="%F0%9F%8F%A0-on-prem-no-static-ip-no-problem">&#x1F3E0; On-Prem: No Static IP, No Problem</h2><p>On the on-prem side, things are surprisingly simple.</p><p>A single machine running Tailscale advertises the local subnet:</p><p>tailscale up --advertise-routes=192.168.0.0/24</p><p>That&#x2019;s it.</p><p>There&#x2019;s no need for:</p><ul><li>Static public IPs</li><li>Port forwarding</li><li>Edge firewall changes</li></ul><p>Tailscale handles NAT traversal automatically. Even behind typical ISP setups, the on-prem network becomes fully reachable from Azure and AWS&#x2014;securely and privately.</p><hr><h2 id="%F0%9F%94%90-security-identity-over-perimeter">&#x1F510; Security: Identity Over Perimeter</h2><p>Traditional VPNs rely heavily on network boundaries&#x2014;if you&#x2019;re inside, you&#x2019;re trusted.</p><p>This design flips that model.</p><ul><li>Every connection is encrypted using WireGuard</li><li>Every node is authenticated via identity</li><li>Access can be restricted using Tailscale ACLs, Azure NSGs, and AWS Security Groups</li></ul><p>Instead of trusting a subnet, you trust <strong>who and what is connecting</strong>.</p><hr><h2 id="%F0%9F%92%B0-cost-where-this-really-shines">&#x1F4B0; Cost: Where This Really Shines</h2><p>In a traditional setup, just enabling connectivity between Azure and AWS could require:</p><ul><li>Azure VPN Gateway</li><li>AWS Site-to-Site VPN</li><li>Possibly a Transit Gateway</li><li>NAT Gateways for outbound access</li></ul><p>Even a basic setup can easily exceed <strong>$200&#x2013;$400 per month</strong>, before considering data transfer.</p><p>In this design, the only real cost is:</p><ul><li>A few small VMs acting as routers</li><li>Minimal peering costs</li><li>Tailscale (often free or low-tier)</li></ul><p>That brings the cost down dramatically&#x2014;often to <strong>under $30/month</strong> for the same functional outcome.</p><hr><h2 id="%E2%9A%96%EF%B8%8F-what-this-design-really-is">&#x2696;&#xFE0F; What This Design Really Is</h2><p>It&#x2019;s tempting to call this a &#x201C;site-to-site VPN,&#x201D; but that&#x2019;s not entirely accurate.</p><p>There are no static tunnels. No IPSec. No centralized gateways.</p><p>Instead, this is:</p><p>A <strong>multi-cloud, identity-based network built using an encrypted overlay (Tailscale) and native cloud routing (peering + route tables).</strong></p><p>It behaves like a site-to-site network&#x2014;but it&#x2019;s far more flexible.</p><hr><h2 id="%F0%9F%A7%A9-scaling-and-high-availability">&#x1F9E9; Scaling and High Availability</h2><p>As demand grows, this design can evolve.</p><p>You can deploy multiple subnet routers advertising the same CIDR. Tailscale will automatically choose the best path, providing failover without complex routing protocols.</p><p>In cloud environments, you can go further:</p><ul><li>Azure VM Scale Sets</li><li>AWS Auto Scaling Groups</li></ul><p>High availability becomes a matter of <strong>adding more routers</strong>, not redesigning the network.</p><hr><h2 id="%F0%9F%8F%81-final-thoughts">&#x1F3C1; Final Thoughts</h2><p>What started as an experiment turned into a clear realization:</p><p>You don&#x2019;t always need heavy, traditional VPN infrastructure to build a secure, multi-site network.</p><p>By combining:</p><ul><li><strong>Tailscale for secure overlay connectivity</strong></li><li><strong>Cloud-native peering for efficient intra-cloud routing</strong></li><li><strong>Proper route table design for traffic control</strong></li></ul><p>You can build a network that is:</p><ul><li>Secure</li><li>Flexible</li><li>Cost-efficient</li><li>Multi-cloud ready</li></ul><p>And most importantly&#x2014;simple enough to deploy and manage without overengineering.</p><hr><p>If you&#x2019;re exploring hybrid or multi-cloud networking, this approach is worth considering. It challenges the default assumptions&#x2014;and in many cases, delivers a better outcome with fewer moving parts.</p>]]></content:encoded></item><item><title><![CDATA[“Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide” Part 3]]></title><description><![CDATA[<p><em>Load balancers are one of those things you don&#x2019;t notice&#x2014;until your website goes down.</em></p><p>Whether you&#x2019;re running a small business site or a production-grade application, relying on a single server is a risk you can&#x2019;t afford. Downtime, traffic spikes, and maintenance windows</p>]]></description><link>https://blog.mutiangpili.com/deploying-kemp-load-balancer-part3/</link><guid isPermaLink="false">697d61e60abe780a02207bfd</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sat, 31 Jan 2026 03:07:11 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/01/kemp2-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/01/kemp2-2.png" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3"><p><em>Load balancers are one of those things you don&#x2019;t notice&#x2014;until your website goes down.</em></p><p>Whether you&#x2019;re running a small business site or a production-grade application, relying on a single server is a risk you can&#x2019;t afford. Downtime, traffic spikes, and maintenance windows shouldn&#x2019;t mean your service disappears.</p><p>This article is&#xA0;<strong>Part 3 of a 3-part series</strong>, where I&#x2019;ll walk you through deploying&#xA0;<strong>Kemp LoadMaster</strong>&#xA0;inside&#xA0;<strong>Proxmox</strong>, configuring it for a&#xA0;<strong>single website</strong>, and integrating it with&#xA0;<strong>Cloudflare</strong>. The goal is simple: build a&#xA0;<strong>reliable, production-ready setup</strong>&#xA0;without unnecessary complexity.</p><p>This is a&#xA0;<strong>practical, step-by-step guide</strong>&#x2014;no theory overload, no vendor hype&#x2014;just what actually works in real-world environments.</p><p>If you&#x2019;re a system engineer, IT admin, or someone building a homelab or SMB infrastructure, this series will help you achieve&#xA0;<strong>high availability, better traffic control, and peace of mind</strong>.</p><p>Let&#x2019;s build it.</p><hr><h3 id="%F0%9F%A7%AD-architecture"><strong>&#x1F9ED; Architecture</strong></h3><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/kemp3.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3" loading="lazy" width="1536" height="1024" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/kemp3.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/kemp3.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/kemp3.png 1536w" sizes="(min-width: 720px) 720px"></figure><h2 id="%E2%9C%85-prerequisites">&#x2705; Prerequisites</h2><p>Before starting, make sure you have the following:</p><h3 id="infrastructure">Infrastructure</h3><ul><li><strong>Kemp LoadMaster</strong> (VM or Hardware)</li><li>At least <strong>one backend web server</strong></li><li>Internet access from Kemp LoadMaster</li></ul><h3 id="accounts-access">Accounts &amp; Access</h3><ul><li><strong>Cloudflare</strong> account</li><li>A registered <strong>domain name</strong></li><li>Admin access to:<ul><li>Cloudflare Dashboard</li><li>Kemp LoadMaster Web UI</li></ul></li></ul><h3 id="network-requirements">Network Requirements</h3><ul><li>Outbound HTTPS (TCP 443) allowed from Kemp</li><li>No inbound ports required when using Cloudflare Tunnel</li></ul><hr><h3 id="step-1-login-to-cloudflare-account">Step 1: Login to CloudFlare Account</h3><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-35.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3" loading="lazy" width="473" height="432"></figure><h3 id="step-2-go-to-connector-tunnel">Step 2: Go to Connector Tunnel</h3><ul><ul><li><strong>Zero Trust - &gt; Network - &gt; Connector </strong></li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-29.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3" loading="lazy" width="1873" height="480" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-29.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-29.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/image-29.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/image-29.png 1873w" sizes="(min-width: 720px) 720px"></figure><h3 id="step-3-create-and-publish-the-kemp-virtual-ip">Step 3: Create and publish the Kemp Virtual IP. </h3><p><em>Take Note: Do not publish the Kemp Console IP</em> </p><ul><ul><li>Select tunnel - &gt; Edit</li><li>Select the <strong>Published application routes </strong>tab</li><li>Click <strong>Add a published application routes</strong> button</li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-30.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3" loading="lazy" width="873" height="386" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-30.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-30.png 873w" sizes="(min-width: 720px) 720px"></figure><ul><ul><li>Fill-up the following:</li><li>Subdomain: `web2`</li><li>Domain: `yourdomainame.com`</li><li>Type: `http`</li><li>URL: `192.168.200.102:5001&apos; - <em>this is the Virtual IP of the Kemp</em></li><li>Click Save</li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-33.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3" loading="lazy" width="1617" height="416" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-33.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-33.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/image-33.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/image-33.png 1617w" sizes="(min-width: 720px) 720px"></figure><h3 id="step-4-test-the-new-publish-website">Step 4: Test the new publish website</h3><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-34.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 3" loading="lazy" width="1190" height="768" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-34.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-34.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-34.png 1190w" sizes="(min-width: 720px) 720px"></figure><h2 id="%F0%9F%8E%AF-final-thoughts">&#x1F3AF; Final Thoughts</h2><p>By combining <strong>Kemp LoadMaster + Cloudflare Tunnel</strong>, you get:</p><ul><li>Enterprise-grade security</li><li>Zero exposed inbound ports</li><li>Clean, scalable architecture</li><li>Easy SSL and DNS management</li></ul><p>This setup is ideal for:</p><ul><li>Production web applications</li><li>Hybrid cloud environments</li><li>Security-focused organizations</li></ul><hr><p><a href="https://blog.mutiangpili.com/kemp-load-balancer-part1/" rel="noreferrer">Part1&#xA0;<em>Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide</em></a></p><p><a href="https://blog.mutiangpili.com/deploying-kemp-load-balancer-part2/" rel="noreferrer">Part2&#xA0;<em>Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide</em></a></p>]]></content:encoded></item><item><title><![CDATA[“Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide” Part 2]]></title><description><![CDATA[<hr><p><em>Load balancers are one of those things you don&#x2019;t notice&#x2014;until your website goes down.</em></p><p>Whether you&#x2019;re running a small business site or a production-grade application, relying on a single server is a risk you can&#x2019;t afford. Downtime, traffic spikes, and maintenance windows</p>]]></description><link>https://blog.mutiangpili.com/deploying-kemp-load-balancer-part2/</link><guid isPermaLink="false">697d59f10abe780a02207b9f</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sat, 31 Jan 2026 01:57:53 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/01/kemp2-1.png" medium="image"/><content:encoded><![CDATA[<hr><img src="https://blog.mutiangpili.com/content/images/2026/01/kemp2-1.png" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2"><p><em>Load balancers are one of those things you don&#x2019;t notice&#x2014;until your website goes down.</em></p><p>Whether you&#x2019;re running a small business site or a production-grade application, relying on a single server is a risk you can&#x2019;t afford. Downtime, traffic spikes, and maintenance windows shouldn&#x2019;t mean your service disappears.</p><p>This article is&#xA0;<strong>Part 2 of a 3-part series</strong>, where I&#x2019;ll walk you through deploying&#xA0;<strong>Kemp LoadMaster</strong>&#xA0;inside&#xA0;<strong>Proxmox</strong>, configuring it for a&#xA0;<strong>single website</strong>, and integrating it with&#xA0;<strong>Cloudflare</strong>. The goal is simple: build a&#xA0;<strong>reliable, production-ready setup</strong>&#xA0;without unnecessary complexity.</p><p>This is a&#xA0;<strong>practical, step-by-step guide</strong>&#x2014;no theory overload, no vendor hype&#x2014;just what actually works in real-world environments.</p><p>If you&#x2019;re a system engineer, IT admin, or someone building a homelab or SMB infrastructure, this series will help you achieve&#xA0;<strong>high availability, better traffic control, and peace of mind</strong>.</p><p>Let&#x2019;s build it.</p><hr><h3 id="create-the-kemp-virtual-service">Create the Kemp Virtual Service </h3><ol><li>Login to LoadMaster Web UI:<br>`https://&lt;LoadMaster-IP&gt;&apos;</li><li>Go to <strong>Virtual Services &#x2192; Add New</strong></li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-12.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2" loading="lazy" width="1841" height="269" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-12.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-12.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/image-12.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/image-12.png 1841w" sizes="(min-width: 720px) 720px"></figure><ol start="3"><li>Set:<ol><li><strong>Virtual Address:</strong> 192.168.200.102</li><li><strong>Port:</strong> 443</li><li><strong>Service Type:</strong> <code>HTTPS</code></li></ol></li><li>Click <strong>Add this Virtual Service</strong></li><li>Add the<strong> Service Name </strong>and click<strong> Set NickName</strong></li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-13.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2" loading="lazy" width="1845" height="519" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-13.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-13.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/image-13.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/image-13.png 1845w" sizes="(min-width: 720px) 720px"></figure><p>&#x2705; Quick test: From LoadMaster, ensure it can reach your web server IP(s).</p><h3 id="add-the-real-server-single-backend">Add the Real Server (single backend)</h3><ol><li>Open the newly created VIP</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-14.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2" loading="lazy" width="1844" height="97" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-14.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-14.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/image-14.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/image-14.png 1844w" sizes="(min-width: 720px) 720px"></figure><ol start="2"><li>Under <strong>Real Servers &#x2192; Add New</strong></li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-15.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2" loading="lazy" width="1576" height="685" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-15.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-15.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-15.png 1576w" sizes="(min-width: 720px) 720px"></figure><ol start="3"><li>Enter: </li></ol><ul><ul><li><strong>Real Server Address:</strong> <code>backend-server-ip</code></li><li><strong>Port:</strong> <code>80</code> (or <code>443</code> if backend uses SSL)</li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-16.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2" loading="lazy" width="1582" height="255" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-16.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-16.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-16.png 1582w" sizes="(min-width: 720px) 720px"></figure><ol start="4"><li>Click <strong>Add This Real Server</strong></li><li>Check the <strong>Status (it should be Green)</strong></li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-17.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D; Part 2" loading="lazy" width="1595" height="96" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-17.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-17.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-17.png 1595w" sizes="(min-width: 720px) 720px"></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#x1F51C; What&#x2019;s Next<br><br>In <b><strong style="white-space: pre-wrap;">Part 3</strong></b>, we&#x2019;ll complete the setup by adding <b><strong style="white-space: pre-wrap;">backend servers and validation testing</strong></b> inside Kemp LoadMaster. <br><br>This is where everything comes together&#x2014;ensuring traffic keeps flowing even when a server goes down.<br></div></div><p><a href="https://blog.mutiangpili.com/kemp-load-balancer-part1/" rel="noreferrer">Part1 <em>Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide</em></a></p><p><a href="https://blog.mutiangpili.com/deploying-kemp-load-balancer-part3/" rel="noreferrer">Part3 <em>Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide</em></a></p>]]></content:encoded></item><item><title><![CDATA[“Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide”]]></title><description><![CDATA[<p><em>Load balancers are one of those things you don&#x2019;t notice&#x2014;until your website goes down.</em></p><p>Whether you&#x2019;re running a small business site or a production-grade application, relying on a single server is a risk you can&#x2019;t afford. Downtime, traffic spikes, and maintenance windows</p>]]></description><link>https://blog.mutiangpili.com/kemp-load-balancer-part1/</link><guid isPermaLink="false">697d489c0abe780a02207b01</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sat, 31 Jan 2026 01:32:12 GMT</pubDate><media:content url="https://blog.mutiangpili.com/content/images/2026/01/kemp2.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.mutiangpili.com/content/images/2026/01/kemp2.png" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;"><p><em>Load balancers are one of those things you don&#x2019;t notice&#x2014;until your website goes down.</em></p><p>Whether you&#x2019;re running a small business site or a production-grade application, relying on a single server is a risk you can&#x2019;t afford. Downtime, traffic spikes, and maintenance windows shouldn&#x2019;t mean your service disappears.</p><p>This article is <strong>Part 1 of a 3-part series</strong>, where I&#x2019;ll walk you through deploying <strong>Kemp LoadMaster</strong> inside <strong>Proxmox</strong>, configuring it for a <strong>single website</strong>, and integrating it with <strong>Cloudflare</strong>. The goal is simple: build a <strong>reliable, production-ready setup</strong> without unnecessary complexity.</p><p>This is a <strong>practical, step-by-step guide</strong>&#x2014;no theory overload, no vendor hype&#x2014;just what actually works in real-world environments.</p><p>If you&#x2019;re a system engineer, IT admin, or someone building a homelab or SMB infrastructure, this series will help you achieve <strong>high availability, better traffic control, and peace of mind</strong>.</p><p>Let&#x2019;s build it.</p><hr><h3 id="what-you-need">What you need</h3><ul><li>Kemp LoadMaster image file:<strong>Best for Proxmox/KVM:</strong> <code>qcow2</code>Also works: <code>vmdk</code> (but import differs)</li><li>VM resources (basic):<strong>CPU:</strong> 2 vCPU<strong>RAM:</strong> 2&#x2013;4 GB<strong>Disk:</strong> 20&#x2013;30 GB<strong>NIC:</strong> VirtIO</li></ul><h3 id="step-1-%E2%80%94-upload-the-image-to-proxmox">Step 1 &#x2014; Upload the image to Proxmox</h3><p>Upload `LoadMaster.vmdk to a node path like:</p><ul><li><code>/var/lib/vz/template/LoadMaster.vmdk</code><br>(or just SCP it anywhere)</li></ul><h3 id="step-2-%E2%80%94-create-an-empty-vm-shell">Step 2 &#x2014; Create an empty VM shell</h3><p>In Proxmox GUI:</p><ol><li><strong>Create VM</strong></li><li>Name: <code>kemp-lm</code></li><li>OS: <strong>Linux</strong></li><li>System:<ul><li>BIOS: <strong>SeaBIOS</strong> (usually fine)</li></ul></li><li>Disks:<ul><li>You can put a tiny disk or <strong>skip</strong> if allowed</li></ul></li><li>CPU/RAM: set your sizing</li><li>Network:<ul><li>Model: <strong>VirtIO (paravirtualized)</strong></li><li>Bridge: <code>vmbr0</code> (or your LAN bridge)</li></ul></li><li>Finish</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-18.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="717" height="506" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-18.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-18.png 717w"></figure><h3 id="step-3-%E2%80%94-import-the-qcow2-disk-into-the-vm">Step 3 &#x2014; Import the qcow2 disk into the VM</h3><p>Pick your storage name (example: <code>local-lvm</code> or <code>local</code>).</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-19.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="734" height="33" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-19.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-19.png 734w" sizes="(min-width: 720px) 720px"></figure><h3 id="step-4-%E2%80%94-attach-the-imported-disk-as-scsi">Step 4 &#x2014; Attach the imported disk as SCSI. </h3><ul><ul><li>Select<strong> kemplb - &gt; Harwdware </strong></li><li>Select <strong>Unused Disk 0</strong> and click <strong>Edit - &gt; Add</strong></li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-20.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="610" height="225" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-20.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-20.png 610w"></figure><h3 id="step-5-%E2%80%94-edit-the-boot-order">Step 5 &#x2014; Edit the Boot Order</h3><ul><ul><li>Select Option</li></ul><ul><li>Select Boot Order</li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-21.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="531" height="170"></figure><ul><ul><li>Select <strong>SCSI and </strong>click <strong>OK</strong></li></ul></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-22.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="644" height="270" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-22.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-22.png 644w"></figure><hr><h3 id="start-the-kemp-vm"><strong>Start the Kemp VM</strong></h3><p>Wait for completion</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-23.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="1298" height="395" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-23.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-23.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-23.png 1298w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-24.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="1445" height="700" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-24.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-24.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-24.png 1445w" sizes="(min-width: 720px) 720px"></figure><hr><h3 id="step-6-network-setup-inside-kemp-first-boot">Step 6. Network setup inside Kemp (first boot)</h3><ul><li>Login to the console</li><li>Assign <strong>IP Address</strong></li><li><strong>Subnet mask</strong></li><li><strong>Default gateway</strong></li><li><strong>DNS</strong></li></ul><h3 id="step-7-access-the-web-ui-and-update-the-license-ensure-you-have-proper-login-in-kemp">Step 7. Access the Web UI and update the license. Ensure you have proper login in Kemp</h3><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-25.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="691" height="479" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-25.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-25.png 691w"></figure><ul><li>Select the Free License Type and Continue</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-26.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="629" height="267" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-26.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-26.png 629w"></figure><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-27.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="621" height="124" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-27.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-27.png 621w"></figure><ul><li>Set a new Password</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-28.png" class="kg-image" alt="&#x201C;Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide&#x201D;" loading="lazy" width="672" height="230" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-28.png 600w, https://blog.mutiangpili.com/content/images/2026/01/image-28.png 672w"></figure><p>&#x1F942; &#x1F389; You have completed the setup of <strong>Kemp Load Balancer</strong></p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#x1F51C; <b><strong style="white-space: pre-wrap;">What&#x2019;s Next</strong></b><br><br>In <b><strong style="white-space: pre-wrap;">Part 2</strong></b>, we&#x2019;ll move beyond the basics and dive into <b><strong style="white-space: pre-wrap;">virtual services, health checks, and traffic handling</strong></b> inside Kemp LoadMaster. This is where the load balancer starts doing real work&#x2014;making smarter decisions and keeping your site available even when things go wrong.<br><br>Stay tuned.</div></div><p><a href="https://blog.mutiangpili.com/deploying-kemp-load-balancer-part2/" rel="noreferrer">Part2&#xA0;<em>Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide</em></a></p><p><a href="https://blog.mutiangpili.com/deploying-kemp-load-balancer-part3/" rel="noreferrer">Part3&#xA0;<em>Deploying Kemp Load Balancer on Proxmox: Full Step-by-Step Setup Guide</em></a></p>]]></content:encoded></item><item><title><![CDATA[Extending Disk Partitions on Ubuntu: The Old-School]]></title><description><![CDATA[Learn how to extend disk partitions on Ubuntu using classic Linux tools like fdisk, parted, and resize2fs. A step-by-step old-school guide.]]></description><link>https://blog.mutiangpili.com/extendingdiskpartition/</link><guid isPermaLink="false">696eb37d2f0c370311c985a1</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sun, 25 Jan 2026 00:31:39 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1658954957744-9f4c52a929b1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxkaXNrfGVufDB8fHx8MTc2OTMwMDM1MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1658954957744-9f4c52a929b1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxkaXNrfGVufDB8fHx8MTc2OTMwMDM1MXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Extending Disk Partitions on Ubuntu: The Old-School"><p>Running out of disk space on Ubuntu is a classic problem &#x2014; especially on servers or long-running systems.</p><p>Modern tools can automate disk resizing, but real Linux control comes from understanding how to extend partitions manually &#x2014; the <em>old-school way</em>.</p><p>This guide walks through extending a disk partition on Ubuntu using traditional Linux tools, without relying on fancy GUIs or cloud automation.</p><hr><h2 id="why-use-the-old-way">Why Use the Old Way?</h2><p>Manual partition extension gives you:</p><ul><li>Full visibility of disk layout</li><li>Safer changes on production systems</li><li>Better troubleshooting control</li><li>Confidence when automation fails</li></ul><p>If you manage servers, virtual machines, or legacy systems, this knowledge is essential.</p><hr><h2 id="step-by-step-guide-for-extending-disk-partition">Step-by-Step Guide for Extending Disk Partition</h2><ol><li>Check the Disk Space</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/Screenshot-2026-01-20-at-6.45.17-AM.png" class="kg-image" alt="Extending Disk Partitions on Ubuntu: The Old-School" loading="lazy" width="1088" height="262" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/Screenshot-2026-01-20-at-6.45.17-AM.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/Screenshot-2026-01-20-at-6.45.17-AM.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/Screenshot-2026-01-20-at-6.45.17-AM.png 1088w" sizes="(min-width: 720px) 720px"></figure><ol start="2"><li>Run CFDISK. </li><li>Select /dev/sda2. </li><li>Navigate to RESIZE - &gt; WRITE - &gt; yes -&gt; Quit</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-1.png" class="kg-image" alt="Extending Disk Partitions on Ubuntu: The Old-School" loading="lazy" width="2000" height="284" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-1.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-1.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/image-1.png 1600w, https://blog.mutiangpili.com/content/images/size/w2400/2026/01/image-1.png 2400w" sizes="(min-width: 720px) 720px"></figure><ol start="5"><li>Set Partition</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-2.png" class="kg-image" alt="Extending Disk Partitions on Ubuntu: The Old-School" loading="lazy" width="1404" height="202" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-2.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-2.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-2.png 1404w" sizes="(min-width: 720px) 720px"></figure><ol start="6"><li>type print (to list the disk)</li><li>type resizepart 2 (/dev/sda2)</li><li>exit</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/Screenshot-2026-01-20-at-6.55.39-AM.png" class="kg-image" alt="Extending Disk Partitions on Ubuntu: The Old-School" loading="lazy" width="1802" height="700" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/Screenshot-2026-01-20-at-6.55.39-AM.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/Screenshot-2026-01-20-at-6.55.39-AM.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/Screenshot-2026-01-20-at-6.55.39-AM.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/Screenshot-2026-01-20-at-6.55.39-AM.png 1802w" sizes="(min-width: 720px) 720px"></figure><ol start="9"><li>Resize the /dev/sda2</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/image-4.png" class="kg-image" alt="Extending Disk Partitions on Ubuntu: The Old-School" loading="lazy" width="1528" height="288" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/image-4.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/image-4.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/image-4.png 1528w" sizes="(min-width: 720px) 720px"></figure><p>Thats it. Congratulati0ns!</p><hr><h3 id="%F0%9F%93%A3-tldr">&#x1F4E3; TL;DR</h3><p>If you can safely extend a Linux partition using <code>fdisk</code> and <code>resize2fs</code>, you&#x2019;re already ahead of most users.</p>]]></content:encoded></item><item><title><![CDATA[Build Your Own Publishing Platform: Ghost on Ubuntu]]></title><description><![CDATA[A hands-on guide to deploying Ghost CMS on Ubuntu, including dependencies, configuration, and real-world troubleshooting tips.]]></description><link>https://blog.mutiangpili.com/build-your-own-publishing-platform-ghost-on-ubuntu/</link><guid isPermaLink="false">696ded6b70cefdc9b2e0d88d</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sun, 18 Jan 2026 10:35:07 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1768471126761-9403f668fd0f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDl8fHx8fHx8fDE3Njg3MjY4Njh8&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1768471126761-9403f668fd0f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8YWxsfDl8fHx8fHx8fDE3Njg3MjY4Njh8&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Build Your Own Publishing Platform: Ghost on Ubuntu"><p>Running your own blog doesn&#x2019;t have to rely on managed platforms. In this guide, I&#x2019;ll walk through installing <strong>Ghost CMS</strong> on <strong>Ubuntu</strong>, using a self-hosted setup that gives you full control over performance, security, and customization.</p><p>This article covers the complete installation process&#x2014;from preparing the Ubuntu server and installing required dependencies, to deploying Ghost with production-ready settings.</p><p>If you&#x2019;re looking to run a modern publishing platform on your own infrastructure&#x2014;whether for learning, experimentation, or production use&#x2014;this guide will help you get there with a clean and stable setup.</p><ol><li><strong>Build a VM container</strong></li><li><strong>Setup Ubuntu OS</strong></li><li><strong>Create New User</strong></li><li><strong>Add User to sudo</strong></li><li><strong>Run as ghost Account</strong></li><li><strong>Install MS Sql</strong> </li></ol><blockquote>sudo apt-get install mysql-server</blockquote><ol start="7"><li><strong>Edit mysql</strong></li></ol><blockquote># Enter mysql<br>sudo mysql<br># Update permissions<br>ALTER USER &apos;root&apos;@&apos;localhost&apos; IDENTIFIED WITH &apos;mysql_native_password&apos; BY &apos;&lt;your-new-root-password&gt;&apos;;<br># Reread permissions<br>FLUSH PRIVILEGES;<br># exit mysql<br>exit</blockquote><ol start="8"><li><strong>Install Node.js</strong></li></ol><blockquote>sudo apt-get update<br>sudo apt-get install -y ca-certificates curl gnupg<br>sudo mkdir -p /etc/apt/keyrings<br>curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg</blockquote><blockquote># Create deb repository<br>NODE_MAJOR=22 # Use a supported version<br>echo &quot;deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main&quot; | sudo tee /etc/apt/sources.list.d/nodesource.list<br><br># Run update and install<br>sudo apt-get update<br>sudo apt-get install nodejs -y</blockquote><ol start="9"><li><strong>Install Ghost-Cli</strong></li></ol><blockquote>sudo npm install ghost-cli@latest -g</blockquote><ol start="10"><li><strong>Create Directory and Folder Permission</strong></li></ol><blockquote># Create directory: Change `sitename` to whatever you like<br>sudo mkdir -p /var/www/sitename<br><br># Set directory owner: Replace &lt;user&gt; with the name of your user<br>sudo chown &lt;user&gt;:&lt;user&gt; /var/www/sitename<br><br># Set the correct permissions<br>sudo chmod 775 /var/www/sitename<br><br># Then navigate into it<br>cd /var/www/sitename</blockquote><ol start="11"><li><strong>Run Install Process</strong></li></ol><blockquote>ghost install</blockquote><ol start="12"><li><strong>Some Questions while installing Ghost</strong></li></ol><blockquote>? Enter your blog URL:&#xA0;<a href="https://blog.mutiangpili.com/">https://blog.mutiangpili.com</a><br>? Enter your MySQL hostname: localhost<br>? Enter your MySQL username: root<br>? Enter your MySQL password: [hidden]<br>? Enter your Ghost database name: ghost_prod<br>? Do you wish to set up &quot;ghost&quot; mysql user? Yes<br>? Do you wish to set up Nginx? No<br>? Do you wish to set up Systemd? Yes<br>? Do you want to start Ghost? Yes</blockquote><ol start="13"><li><strong>Congratulations! &#x1F942;</strong></li></ol><p>Ghost was installed successfully! To complete setup of your publication, visit:</p><pre><code>https://blog.mutiangpili.com/ghost/</code></pre><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">TL;DR &#x2013; Key Takeaways</strong></b><br>&#x2022; Use a&#xA0;<b><strong style="white-space: pre-wrap;">Ghost-supported Node.js version</strong></b>&#xA0;to avoid issues with native modules like&#xA0;sharp.<br>&#x2022;&#xA0;<b><strong style="white-space: pre-wrap;">Back up</strong></b>&#xA0;your database and&#xA0;content/&#xA0;directory before upgrades or major changes.<br>&#x2022; Check&#xA0;<b><strong style="white-space: pre-wrap;">file ownership and permissions</strong></b>&#x2014;most upload and theme issues start there.<br>&#x2022; Monitor&#xA0;<b><strong style="white-space: pre-wrap;">disk space and Ghost logs</strong></b>&#xA0;(ghost log) to catch silent failures early.<br>&#x2022; Deploy behind&#xA0;<b><strong style="white-space: pre-wrap;">Nginx with HTTPS</strong></b>&#xA0;and avoid exposing the&#xA0;/ghost&#xA0;admin endpoint publicly.<br>&#x2022; Restart and test&#xA0;<b><strong style="white-space: pre-wrap;">incrementally</strong></b>&#xA0;after each configuration change.</div></div>]]></content:encoded></item><item><title><![CDATA[10 Years After My First Blog]]></title><description><![CDATA[<p>It&#x2019;s been a while since I last posted a blog on my Medium page: <a href="https://medium.com/@marlonmutya?ref=blog.mutiangpili.com" rel="noopener">https://medium.com/@marlonmutya</a>.</p><p>I&#x2019;ve always wanted to have my own blog hosted on a self-managed server, and it took a few months to build a new machine to make that happen.</p>]]></description><link>https://blog.mutiangpili.com/10-year-after-my-first-blog-2/</link><guid isPermaLink="false">696df1882f0c370311c9850c</guid><dc:creator><![CDATA[Marlon Mutiangpili]]></dc:creator><pubDate>Sun, 18 Jan 2026 02:45:37 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1761839257961-4dce65b72d99?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wxfDF8YWxsfDF8fHx8fHx8fDE3Njg3MDQyNjB8&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1761839257961-4dce65b72d99?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wxfDF8YWxsfDF8fHx8fHx8fDE3Njg3MDQyNjB8&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="10 Years After My First Blog"><p>It&#x2019;s been a while since I last posted a blog on my Medium page: <a href="https://medium.com/@marlonmutya?ref=blog.mutiangpili.com" rel="noopener">https://medium.com/@marlonmutya</a>.</p><p>I&#x2019;ve always wanted to have my own blog hosted on a self-managed server, and it took a few months to build a new machine to make that happen. It wasn&#x2019;t as straightforward as it seemed&#x2014;different environments come with different challenges.</p><p>This space is now open to everyone, and all opinions are welcome.</p><p>Cheers!</p>]]></content:encoded></item><item><title><![CDATA[🛡️ How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide]]></title><description><![CDATA[Keeping your security stack up to date is critical for maintaining visibility and compliance. Wazuh agents play a key role in collecting…]]></description><link>https://blog.mutiangpili.com/ef-b8-8f-how-to-seamlessly-upgrade-wazuh-agents-a-step-by-step-guide/</link><guid isPermaLink="false">696df1882f0c370311c9850d</guid><dc:creator><![CDATA[MARLON MUTIANGPILI]]></dc:creator><pubDate>Tue, 07 Oct 2025 13:06:14 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1523961131990-5ea7c61b2107?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fFRlY2h8ZW58MHx8fHwxNzY4ODEzMTAxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1523961131990-5ea7c61b2107?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fFRlY2h8ZW58MHx8fHwxNzY4ODEzMTAxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide"><p>Keeping your security stack up to date is critical for maintaining visibility and compliance. Wazuh agents play a key role in collecting telemetry from endpoints and forwarding it to the Wazuh manager for analysis and alerting. In this post, I&#x2019;ll walk you through a clean and reliable way to <strong>upgrade Wazuh agents</strong>&#x200A;&#x2014;&#x200A;whether you&#x2019;re managing a few servers or scaling across multiple environments.</p><h3 id="%F0%9F%93%8C-why-upgrade-the-wazuh-agent">&#x1F4CC; Why Upgrade the Wazuh Agent?</h3><p>Upgrading agents ensures:</p><ul><li>&#x2705; Compatibility with the latest Wazuh Manager version</li><li>&#x1F510; Security patches and performance improvements</li><li>&#x1F9F0; Access to new monitoring modules and bug fixes</li><li>&#x1F4CA; Better stability for log collection and analysis</li></ul><p>Running mismatched versions between the agent and the manager can cause communication issues or feature limitations. Keeping them aligned is a best practice in any SOC environment.</p><h3 id="using-cli">(Using CLI)</h3><h4 id="%F0%9F%A7%AD-step-1-check-the-current-agent-version">&#x1F9ED; Step 1: Check the Current Agent Version</h4><p>Before upgrading, check what version is currently installed:</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-iticrma7ewel6qw3h2t0tw.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="467" height="66"></figure><h4 id="%E2%9A%99%EF%B8%8F-step-2-install-the-wazuh-agent">&#x2699;&#xFE0F; Step 2: Install the Wazuh Agent</h4><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-s2xovprvltfqy8-hcz8v6q.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="499" height="36"></figure><h3 id="using-gui">(Using GUI)</h3><p>Step 1: Login to the Wazuh Dashboard and verify the version of the Wazuh Agent</p><p>Step 2: Select the 3 dots and Click Upgrade</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-ey5xanz0pdtdy0qdkn3ija.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="261" height="170"></figure><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-7pnlnydp98lduge_n73bew.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="397" height="277"></figure><blockquote><em>Step 3: Verify the Task</em></blockquote><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-wortyukh4ghehok_0p8oqg.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="1086" height="542" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/1-wortyukh4ghehok_0p8oqg.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/1-wortyukh4ghehok_0p8oqg.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/1-wortyukh4ghehok_0p8oqg.png 1086w" sizes="(min-width: 720px) 720px"></figure><p>Step 4: Verify the task status is DONE and the Agent has been updated.</p><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-zyj2-jbby-fdnfhbedbu4g.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="1092" height="545" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/1-zyj2-jbby-fdnfhbedbu4g.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/1-zyj2-jbby-fdnfhbedbu4g.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/1-zyj2-jbby-fdnfhbedbu4g.png 1092w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.mutiangpili.com/content/images/2026/01/1-jlnbymcwqff5glamjqb1xw.png" class="kg-image" alt="&#x1F6E1;&#xFE0F; How to Seamlessly Upgrade Wazuh Agents: A Step-by-Step Guide" loading="lazy" width="1853" height="37" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/1-jlnbymcwqff5glamjqb1xw.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/1-jlnbymcwqff5glamjqb1xw.png 1000w, https://blog.mutiangpili.com/content/images/size/w1600/2026/01/1-jlnbymcwqff5glamjqb1xw.png 1600w, https://blog.mutiangpili.com/content/images/2026/01/1-jlnbymcwqff5glamjqb1xw.png 1853w" sizes="(min-width: 720px) 720px"></figure><h3 id="%F0%9F%8C%90-automate-at-scale-optional">&#x1F310; Automate at Scale (Optional)</h3><p>For larger environments, consider using:</p><ul><li><strong>Ansible / Puppet / Chef</strong> to roll out upgrades in batches</li><li><strong>SSH or remote execution tools</strong> to push updates to groups of servers</li><li><strong>Version pinning</strong> to ensure consistent agent versions across environments</li></ul><h3 id="%E2%9C%85-final-thoughts">&#x2705; Final Thoughts</h3><p>Upgrading Wazuh agents is a quick but essential maintenance task that strengthens your overall security posture. By following a structured approach&#x200A;&#x2014;&#x200A;<strong>check &#x2192; download &#x2192; upgrade &#x2192; validate</strong>&#x200A;&#x2014;&#x200A;you minimize downtime and ensure your monitoring remains intact.</p>]]></content:encoded></item><item><title><![CDATA[🚀 How Twingate Turned My Network Into a Zero-Trust Paradise]]></title><description><![CDATA[Ditch the clunky VPN. Discover how Twingate makes secure access faster, simpler, and way less rage-inducing.]]></description><link>https://blog.mutiangpili.com/how-twingate-turned-my-network-into-a-zero-trust-paradise/</link><guid isPermaLink="false">696df1882f0c370311c9850e</guid><dc:creator><![CDATA[MARLON MUTIANGPILI]]></dc:creator><pubDate>Sat, 27 Sep 2025 01:02:05 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1550751827-4bd374c3f58b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fFRlY2h8ZW58MHx8fHwxNzY4ODEzMTAxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1550751827-4bd374c3f58b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fFRlY2h8ZW58MHx8fHwxNzY4ODEzMTAxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="&#x1F680; How Twingate Turned My Network Into a Zero-Trust Paradise"><p>Ditch the clunky VPN. Discover how Twingate makes secure access faster, simpler, and way less rage-inducing.</p><p>Let&#x2019;s be real VPNs feel like that old office printer: bulky, moody, and somehow always &#x201C;offline&#x201D; when you need it most. They&#x2019;re supposed to make things secure, but half the time they just make your Netflix stream look like it was filmed on a potato.</p><p>Enter <strong>Twingate</strong> the VPN replacement that doesn&#x2019;t give you headaches, doesn&#x2019;t hog your bandwidth, and actually makes Zero Trust sound&#x2026; kinda cool.</p><h3 id="%F0%9F%95%B5%EF%B8%8F-what%E2%80%99s-the-big-deal-with-vpns-anyway">&#x1F575;&#xFE0F; What&#x2019;s the Big Deal with VPNs Anyway?</h3><p>Traditional VPNs are like building a giant castle wall and forcing everyone to come in through the same creaky drawbridge. Works fine if you&#x2019;re defending against dragons, but in the 21st century, your company&#x2019;s &#x201C;castle&#x201D; is scattered across AWS, GCP, Azure, and that one random NAS box under Bob&#x2019;s desk.</p><ul><li>VPNs = bottleneck city</li><li>Twingate = no bottlenecks, no drama.</li></ul><h3 id="%E2%9A%A1-how-twingate-flips-the-script">&#x26A1; How Twingate Flips the Script</h3><p>Instead of dragging traffic through one central gateway (VPN-style), Twingate is like giving each employee their own invisibility cloak. They connect <strong>only to the resources they need</strong>, when they need them.</p><ul><li>Zero Trust? &#x2705;</li><li>Latency who? &#x274C;</li><li>Angry IT tickets titled <em>&#x201C;VPN SLOW!!!&#x201D;</em>? &#x1F64C; Bye.</li></ul><p>It&#x2019;s like <em>Grab</em> or <em>DoorDash</em> for secure access: only the goodies you ordered, delivered right to you&#x200A;&#x2014;&#x200A;no extra baggage.</p><h3 id="%F0%9F%98%82-relatable-techie-struggles-twingate-fixes">&#x1F602; Relatable Techie Struggles Twingate Fixes</h3><ul><li><strong>That one guy on the VPN who accidentally nukes everyone&#x2019;s bandwidth while &#x201C;downloading Linux ISOs.&#x201D;</strong></li><li><strong>You forgetting to disconnect and then wondering why your Netflix is streaming at potato quality.</strong></li><li><strong>Explaining to non-IT coworkers why the VPN &#x201C;disconnects when you close your laptop&#x201D; .</strong></li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.mutiangpili.com/content/images/2026/01/0-rvyylttk7-np7h2y.png" class="kg-image" alt="&#x1F680; How Twingate Turned My Network Into a Zero-Trust Paradise" loading="lazy" width="1536" height="1024" srcset="https://blog.mutiangpili.com/content/images/size/w600/2026/01/0-rvyylttk7-np7h2y.png 600w, https://blog.mutiangpili.com/content/images/size/w1000/2026/01/0-rvyylttk7-np7h2y.png 1000w, https://blog.mutiangpili.com/content/images/2026/01/0-rvyylttk7-np7h2y.png 1536w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Twingate just&#x2026; sidesteps all that. It&#x2019;s basically VPN&#xA0;therapy.</span></figcaption></figure><h3 id="%F0%9F%9B%A0%EF%B8%8F-the-nerdy-bits-simplified">&#x1F6E0;&#xFE0F; The Nerdy Bits (Simplified)</h3><ul><li><strong>Zero Trust Network Access (ZTNA):</strong> Instead of trusting everyone inside the moat, assume nobody&#x2019;s trustworthy until proven otherwise.</li><li><strong>Split tunneling done right:</strong> No more routing all your traffic through HQ just to check Slack.</li><li><strong>Deploy in minutes, not days:</strong> IT finally gets to drink their coffee hot.</li></ul><h3 id="%F0%9F%8F%81-final-thoughts">&#x1F3C1; Final Thoughts</h3><p>Twingate feels less like a network tool and more like the moment you upgraded from a Nokia brick phone to a smartphone. Once you use it, you wonder how you ever survived without it.</p><p>So the next time someone complains about the VPN, just smile and say:<br> <strong>&#x201C;Bro, we don&#x2019;t do VPNs here. We Twingate.&#x201D;</strong></p><p>&#x1F449; <em>Your move, VPNs. Time to retire.</em></p>]]></content:encoded></item></channel></rss>