<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JICDev</title>
    <description>The latest articles on DEV Community by JICDev (@jic).</description>
    <link>https://dev.to/jic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3477820%2Ffe13fa53-86d1-41eb-8201-4a19e9681493.png</url>
      <title>DEV Community: JICDev</title>
      <link>https://dev.to/jic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jic"/>
    <language>en</language>
    <item>
      <title>Understanding Basic Networking Fundamentals as a Devops Engineer</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Fri, 21 Nov 2025 00:12:19 +0000</pubDate>
      <link>https://dev.to/jic/understanding-basic-networking-fundamentals-as-a-devops-engineer-178o</link>
      <guid>https://dev.to/jic/understanding-basic-networking-fundamentals-as-a-devops-engineer-178o</guid>
      <description>&lt;p&gt;Networking is one of the most important foundations for anyone learning DevOps. Whether you’re working with servers, containers, cloud platforms, or automation tools, everything relies on systems communicating with each other correctly.&lt;/p&gt;

&lt;p&gt;This post is a simple, beginner-friendly guide covering the essential networking concepts I learned early in my DevOps journey. By the end, you’ll understand IP addressing, subnets, DNS, ports, routing, SSH, and common Linux networking tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What Is Networking?
&lt;/h2&gt;

&lt;p&gt;Networking is the practice of connecting devices so they can share information. Every time you browse a website, access a server, or deploy an application, networking is involved.&lt;/p&gt;

&lt;p&gt;Different types of networks serve different purposes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LAN&lt;/td&gt;
&lt;td&gt;Covers a small area&lt;/td&gt;
&lt;td&gt;Home Wi-Fi, office network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAN&lt;/td&gt;
&lt;td&gt;Covers a city-sized area&lt;/td&gt;
&lt;td&gt;City-wide fiber or Wi-Fi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WAN&lt;/td&gt;
&lt;td&gt;Connects networks across long distances&lt;/td&gt;
&lt;td&gt;The Internet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even large cloud providers like Azure, AWS and Google Cloud are built on top of massive WAN infrastructures.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. IP Addressing
&lt;/h2&gt;

&lt;p&gt;Every device on a network has an IP address. It acts like a home address: without it, data wouldn’t know where to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  IPv4 Format
&lt;/h3&gt;

&lt;p&gt;IPv4 addresses are written in four sections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each IP contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network ID&lt;/strong&gt; – identifies the network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host ID&lt;/strong&gt; – identifies the device inside that network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although older systems used fixed “classes” (Class A, B, C), modern networks rely on CIDR notation for flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. CIDR and Subnetting
&lt;/h2&gt;

&lt;p&gt;Subnetting is the process of dividing a network into smaller parts. DevOps engineers work with subnets all the time in cloud environments like AWS VPCs or when designing Docker/Kubernetes networks.&lt;/p&gt;

&lt;h3&gt;
  
  
  CIDR Basics
&lt;/h3&gt;

&lt;p&gt;CIDR notation looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.0.0.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The number after the slash tells you how many bits belong to the network. The rest are for hosts.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/24&lt;/code&gt; → 24 bits for network, 8 bits for hosts&lt;/li&gt;
&lt;li&gt;Host capacity → 2^8 = 256 total IPs (254 usable)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Subnetting Example
&lt;/h3&gt;

&lt;p&gt;If you divide a /24 network into four equal networks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You borrow 2 bits&lt;/li&gt;
&lt;li&gt;New CIDR becomes /26&lt;/li&gt;
&lt;li&gt;Each subnet has 64 IP addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Another Example: Divide 10.0.0.0/24 Into 8 Subnets
&lt;/h3&gt;

&lt;p&gt;Borrow 3 bits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2^3 = 8 subnets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each subnet becomes /27.&lt;/p&gt;

&lt;p&gt;This level of subnetting is common when organizing infrastructure into dev, staging, and production networks.&lt;/p&gt;

&lt;p&gt;If you want to check your work, the &lt;code&gt;ipcalc&lt;/code&gt; tool helps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ipcalc 192.168.10.0/26
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. DNS: Turning Names Into IPs
&lt;/h2&gt;

&lt;p&gt;Computers communicate using IP addresses, but humans remember names. DNS (Domain Name System) converts readable names like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;into machine-friendly IP addresses.&lt;/p&gt;

&lt;h3&gt;
  
  
  How DNS Resolution Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You enter a domain in your browser.&lt;/li&gt;
&lt;li&gt;Your computer checks its local DNS cache.&lt;/li&gt;
&lt;li&gt;If it’s not found, it asks a DNS resolver (like 8.8.8.8).&lt;/li&gt;
&lt;li&gt;The resolver contacts DNS servers to find the IP.&lt;/li&gt;
&lt;li&gt;The IP is returned to your system.&lt;/li&gt;
&lt;li&gt;Your computer connects to the website.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Useful commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig google.com
nslookup google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In DevOps, DNS issues often cause “site not reachable” or “service can’t connect” errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Ports and Protocols
&lt;/h2&gt;

&lt;p&gt;An IP address can host many services. Ports help differentiate them.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;22 → SSH&lt;/li&gt;
&lt;li&gt;80 → HTTP&lt;/li&gt;
&lt;li&gt;443 → HTTPS&lt;/li&gt;
&lt;li&gt;53 → DNS&lt;/li&gt;
&lt;li&gt;3306 → MySQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  TCP vs UDP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TCP&lt;/strong&gt; is reliable and connection-oriented (used for SSH, HTTPS, APIs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UDP&lt;/strong&gt; is faster but connectionless (used for DNS, streaming, VoIP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check open ports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ss -tuln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or test a web server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -I https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Routing and Gateways
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;gateway&lt;/strong&gt; is the device that forwards your traffic to other networks. On home networks, your router serves that role.&lt;/p&gt;

&lt;p&gt;View your routing table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip route show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will usually see a line like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default via 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means anything not on your local network goes through the router.&lt;/p&gt;

&lt;p&gt;To see how your packet travels to a website:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;traceroute google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps diagnose slow or failing network paths.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Essential Linux Networking Tools
&lt;/h2&gt;

&lt;p&gt;These commands are used daily by DevOps engineers to diagnose issues.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ping&lt;/td&gt;
&lt;td&gt;Test basic connectivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;traceroute&lt;/td&gt;
&lt;td&gt;See the path traffic takes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;curl&lt;/td&gt;
&lt;td&gt;Make HTTP requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ss / netstat&lt;/td&gt;
&lt;td&gt;Check open ports and connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dig / nslookup&lt;/td&gt;
&lt;td&gt;Inspect DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telnet or nc&lt;/td&gt;
&lt;td&gt;Test if a port is open&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping google.com
curl -I https://google.com
telnet google.com 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding these tools makes network debugging much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. SSH: Secure Remote Access
&lt;/h2&gt;

&lt;p&gt;SSH (Secure Shell) is how DevOps engineers connect to remote Linux servers.&lt;/p&gt;

&lt;p&gt;Basic usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh user@server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SSH encrypts all traffic and is far safer than older remote-login methods.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSH Keys
&lt;/h3&gt;

&lt;p&gt;SSH keys allow password-less authentication.&lt;/p&gt;

&lt;p&gt;Generate keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload the public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-copy-id user@server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most cloud platforms (AWS, DigitalOcean, Azure) depend heavily on SSH keys for secure access.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. A Small Practice Lab (Optional)
&lt;/h2&gt;

&lt;p&gt;Try these on your system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find your IP and default gateway&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, and &lt;code&gt;traceroute&lt;/code&gt; on any website&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;dig&lt;/code&gt; to look up the IP of a domain&lt;/li&gt;
&lt;li&gt;SSH into a local VM or server&lt;/li&gt;
&lt;li&gt;Subnet 10.0.0.0/24 into 8 subnets&lt;/li&gt;
&lt;li&gt;Describe what happens when you run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hands-on practice will cement your understanding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Networking isn’t just “another topic” in DevOps—it’s the foundation everything else sits on. You’ll need it when working with Docker, Kubernetes, cloud networking (AWS VPCs), load balancers, service discovery, firewalls, and CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;You now understand the essentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What networks are and how devices communicate&lt;/li&gt;
&lt;li&gt;How IP addresses and subnets work&lt;/li&gt;
&lt;li&gt;Why DNS is critical&lt;/li&gt;
&lt;li&gt;How ports enable multiple services&lt;/li&gt;
&lt;li&gt;How routing moves traffic&lt;/li&gt;
&lt;li&gt;How to test and troubleshoot connectivity&lt;/li&gt;
&lt;li&gt;How to access servers using SSH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Master these fundamentals and you’ll be ready to tackle more advanced DevOps networking topics like load balancing, NAT, container networking, and Kubernetes networking.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>devops</category>
      <category>cloudcomputing</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>Deploying a PHP Web App to Azure App Service CI/CD Pipelines</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Fri, 14 Nov 2025 12:37:06 +0000</pubDate>
      <link>https://dev.to/jic/deploying-a-php-web-app-to-azure-app-service-471c</link>
      <guid>https://dev.to/jic/deploying-a-php-web-app-to-azure-app-service-471c</guid>
      <description>&lt;h2&gt;
  
  
  What You’ll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How Azure App Service works&lt;/li&gt;
&lt;li&gt;How to set up a PHP environment on Azure&lt;/li&gt;
&lt;li&gt;How to upload and host your PHP files&lt;/li&gt;
&lt;li&gt;Common setup errors (and how to fix them)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is Azure App Service?
&lt;/h2&gt;

&lt;p&gt;Azure App Service is a managed platform by Microsoft that lets you easily deploy and scale web applications.&lt;/p&gt;

&lt;p&gt;Think of it as your own web server in the cloud — no need to install Apache or Nginx, Azure takes care of all of that.&lt;/p&gt;

&lt;p&gt;It supports multiple programming languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;.NET&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this tutorial, we’ll use the PHP runtime stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Microsoft Azure account (&lt;a href="https://portal.azure.com" rel="noopener noreferrer"&gt;Create one here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A PHP project (with at least &lt;code&gt;index.php&lt;/code&gt; i.e
## Example: Simple PHP App&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to test Azure’s setup, try this simple app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Hello Azure&amp;lt;/h1&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;p&amp;gt;This is my first PHP app on Azure App Service.&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this as &lt;code&gt;index.php&lt;/code&gt; and upload it to &lt;code&gt;/site/wwwroot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;---)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A stable internet connection&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Create a Web App on Azure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1.1: Go to Azure Portal
&lt;/h3&gt;

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




&lt;h3&gt;
  
  
  Step 1.2: Search for “App Services”
&lt;/h3&gt;

&lt;p&gt;In the top search bar, type &lt;strong&gt;App Services&lt;/strong&gt;, then click &lt;strong&gt;Create&lt;/strong&gt; → &lt;strong&gt;Web App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybnvvhx5zf05kkcejcdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybnvvhx5zf05kkcejcdk.png" alt=" " width="739" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfv04i3ymjjf10p58slm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfv04i3ymjjf10p58slm.png" alt=" " width="551" height="344"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1.3: Configure the Basics
&lt;/h3&gt;

&lt;p&gt;Fill out the required information:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;Choose your active Azure subscription&lt;/td&gt;
&lt;td&gt;Pay-As-You-Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Group&lt;/td&gt;
&lt;td&gt;Create new&lt;/td&gt;
&lt;td&gt;php-demo-rg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Your app’s unique name&lt;/td&gt;
&lt;td&gt;my-php-app-demo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish&lt;/td&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Stack&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;PHP 8.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operating System&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;Closest to you&lt;/td&gt;
&lt;td&gt;West Europe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Service Plan&lt;/td&gt;
&lt;td&gt;Create new&lt;/td&gt;
&lt;td&gt;php-service-plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y1s3z44hjpc70fdbvxq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y1s3z44hjpc70fdbvxq.png" alt=" " width="674" height="877"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;br&gt;
The App Service Plan defines the CPU, memory, and scaling limits for your app.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1.4: Deployment Settings
&lt;/h3&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deploy manually (no CI/CD for now)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can connect GitHub later if you want continuous deployment.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1.5: Review + Create
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt;, then &lt;strong&gt;Create&lt;/strong&gt;.&lt;br&gt;
Azure will deploy your web app — this usually takes 2–3 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8m1g7s1tq4n2wp6oskz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8m1g7s1tq4n2wp6oskz.png" alt=" " width="609" height="550"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Upload Your PHP Files
&lt;/h2&gt;

&lt;p&gt;Once your web app is deployed, upload your project files.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Connect GitHub for Continuous Deployment
&lt;/h2&gt;

&lt;p&gt;If you want Azure to automatically redeploy your app whenever you push updates to GitHub:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your App Service → &lt;strong&gt;Deployment Center&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;GitHub&lt;/strong&gt; as the source&lt;/li&gt;
&lt;li&gt;Select your repo and branch&lt;/li&gt;
&lt;li&gt;Save settings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, every GitHub push automatically redeploys your app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwee490v02sgqjv90tzol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwee490v02sgqjv90tzol.png" alt=" " width="800" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwto92gl7fd49icnklsik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwto92gl7fd49icnklsik.png" alt=" " width="800" height="832"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Test Your Website
&lt;/h2&gt;

&lt;p&gt;Open your browser and visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://yourappname.azurewebsites.net


![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q9wteiinpp2i0yejd2if.png)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything went well, your PHP app should now be live.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Option ways to upload your Php files to Azure Web App&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Upload via Azure Portal
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your App Service from the Azure dashboard&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Development Tools → Advanced Tools → Go → Open Kudu&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Debug Console → CMD&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;code&gt;/site/wwwroot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Drag and drop your PHP files (e.g. &lt;code&gt;index.php&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;/site/wwwroot&lt;/code&gt; directory is the public folder Azure serves to users.&lt;/p&gt;




&lt;h3&gt;
  
  
  Option 2 : Upload via FTP
&lt;/h3&gt;

&lt;p&gt;If your project has many files, use FTP.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your App Service → &lt;strong&gt;Deployment Center → FTP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;FTP Hostname&lt;/strong&gt;, &lt;strong&gt;Username&lt;/strong&gt;, and &lt;strong&gt;Password&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;FileZilla&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Upload your PHP files into &lt;code&gt;/site/wwwroot&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Common Errors and Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;404 Not Found&lt;/td&gt;
&lt;td&gt;Wrong folder or missing index.php&lt;/td&gt;
&lt;td&gt;Make sure your files are in &lt;code&gt;/site/wwwroot&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blank Page&lt;/td&gt;
&lt;td&gt;PHP version mismatch&lt;/td&gt;
&lt;td&gt;Check your runtime stack in App Settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Restart your App Service after uploading new files.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding What’s Happening Behind the Scenes
&lt;/h2&gt;

&lt;p&gt;When you create a Web App:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Service Plan&lt;/strong&gt; defines your hosting resources (CPU, memory, scaling)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web App&lt;/strong&gt; is your hosted website instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wwwroot&lt;/strong&gt; is the public directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP Runtime Stack&lt;/strong&gt; is Azure’s PHP environment that executes your code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 5: Optional – Add a Custom Domain
&lt;/h2&gt;

&lt;p&gt;If you want to use your own domain (like &lt;code&gt;www.myportfolio.com&lt;/code&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your App Service → &lt;strong&gt;Custom Domains&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add your domain name&lt;/li&gt;
&lt;li&gt;Update your DNS records using Azure’s values&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;When I first did this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I once had a blank page — caused by using the wrong PHP version.&lt;/li&gt;
&lt;li&gt;After re-uploading my files and restarting the app, everything worked.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Deploying a PHP web app to Azure App Service is straightforward once you understand how the pieces fit together.&lt;/p&gt;

&lt;p&gt;To summarize:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Web App using the PHP runtime&lt;/li&gt;
&lt;li&gt;Upload your project to github then connect to the Azure for CI/CD&lt;/li&gt;
&lt;li&gt;Test it at your &lt;code&gt;azurewebsites.net&lt;/code&gt; URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You now have a PHP site hosted in the cloud!&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;In a future post, I’ll cover how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automate deployments using GitHub Actions so do well to follow me not to miss out&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>php</category>
      <category>azure</category>
      <category>cicd</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How to Configure NGINX, and Host Your Local Website on Ubuntu Installed on VMware</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Mon, 10 Nov 2025 22:37:53 +0000</pubDate>
      <link>https://dev.to/jic/how-to-configure-nginx-and-host-your-local-website-on-ubuntu-installed-on-vmware-pi6</link>
      <guid>https://dev.to/jic/how-to-configure-nginx-and-host-your-local-website-on-ubuntu-installed-on-vmware-pi6</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This guide walks through my full journey of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enabling copy-paste and VMware Tools&lt;/li&gt;
&lt;li&gt;Installing and configuring NGINX&lt;/li&gt;
&lt;li&gt;Hosting a local HTML website&lt;/li&gt;
&lt;li&gt;Fixing common Linux/VMware errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every problem I faced is documented, including why it happened and how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can follow this tutorial even as a complete beginner.
&lt;/h2&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;1. Installing Ubuntu on VMware&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;After downloading the Ubuntu ISO and creating a new VMware virtual machine, the installation completed successfully.&lt;/p&gt;

&lt;p&gt;However, I immediately noticed something was wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy/paste did not work from &lt;strong&gt;Windows → Ubuntu&lt;/strong&gt; neither from &lt;strong&gt;Ubuntu → Windows&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This usually means &lt;strong&gt;VMware Tools is missing or not properly installed&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;2. Installing and Verifying VMware Tools&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;open-vm-tools open-vm-tools-desktop &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To first update your VM and then install the tools. &lt;/p&gt;

&lt;p&gt;Then I rebooted the VM with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To check if VMware Tools was installed, I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vmware-toolbox-cmd &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Correct output (after installation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;12.5.0.51152 (build-24276846)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What happened initially
&lt;/h3&gt;

&lt;p&gt;At first, copy/paste only worked in one direction. This confirmed that VMware Tools needed to be installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;From VMware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VM → Install VMware Tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ubuntu mounted the VMware Tools installer. After installation and a reboot, two-way copy/paste worked correctly.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why VMware Tools matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enables clipboard sharing&lt;/li&gt;
&lt;li&gt;Enables drag-and-drop&lt;/li&gt;
&lt;li&gt;Improves display resolution&lt;/li&gt;
&lt;li&gt;Improves VM performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;3. Installing NGINX&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Before installation, I updated Ubuntu:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then installed NGINX:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Check the installed version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nginx &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start NGINX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable at boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbmjrnhqh5136n317z4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbmjrnhqh5136n317z4r.png" alt=" " width="585" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, visiting the VM IP address in a browser should show the default NGINX welcome page.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;4. Hosting a Local Website with NGINX&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;I decided to host a simple website from this directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/myresume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating the directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/myresume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Assigning permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="nv"&gt;$USER&lt;/span&gt;:&lt;span class="nv"&gt;$USER&lt;/span&gt; /var/www/myresume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;Creating the HTML File&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /var/www/myresume/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzao04wc1i7a3i29ernl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzao04wc1i7a3i29ernl.png" alt=" " width="621" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You would notice in the image above I imputed it all together!  Linux terminal allows you run multiple commands at a time.&lt;/p&gt;

&lt;p&gt;Inside the file "nano /var/www/myresume/index.html":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;My Resume Website&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hosted locally on Ubuntu using NGINX.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You could use whatever website template you have available or prefer. This sould be imputed in the editor&lt;/strong&gt;&lt;br&gt;
Save and exit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CTRL + O = save&lt;/li&gt;
&lt;li&gt;ENTER = save name&lt;/li&gt;
&lt;li&gt;CTRL + X = exit&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Important Mistake I Made&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;At first, I accidentally typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/myreusme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because of this typo, NGINX could not find the correct directory and displayed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;404 Not Found
nginx/1.24.0 (Ubuntu)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I confirmed the issue with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /var/www/myresume
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /var/www/myreusme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second path did not exist, confirming the error.&lt;/p&gt;

&lt;p&gt;Fixing the directory name resolved the issue.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;5. Configuring NGINX to Serve the Website&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Create a server block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/myresume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

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

    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/myresume&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable the site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/myresume /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload NGINX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgu5yqf7cxkr7int0ftj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgu5yqf7cxkr7int0ftj.png" alt=" " width="752" height="165"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;6. Testing the Website&lt;/strong&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Get the VM IP address:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mine was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.107.13?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test in browser:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://192.168.107.13?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It loaded correctly.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;7. Real Errors I Encountered (And How I Fixed Them)&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Error: 404 Not Found
&lt;/h2&gt;

&lt;p&gt;Cause:&lt;br&gt;
Incorrect directory name due to a typo (&lt;code&gt;myreusme&lt;/code&gt; instead of &lt;code&gt;myresume&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Fix:&lt;br&gt;
Corrected the folder name and HTML file path.&lt;/p&gt;


&lt;h2&gt;
  
  
  Error: curl not found
&lt;/h2&gt;

&lt;p&gt;When testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://192.168.107.13?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I got:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Command 'curl' not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Warning: NGINX config changed on disk
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Warning: The unit file or drop-ins changed on disk
Run 'systemctl daemon-reload'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  &lt;strong&gt;8. Final Verification&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Browser test: success&lt;br&gt;
curl test: success&lt;br&gt;
Nginx reload: success&lt;br&gt;
VM tools: fully working&lt;/p&gt;

&lt;p&gt;The website was now being served perfectly from NGINX.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;In this project, I learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to install Ubuntu on VMware&lt;/li&gt;
&lt;li&gt;How to verify and install VMware Tools&lt;/li&gt;
&lt;li&gt;How to install and manage NGINX&lt;/li&gt;
&lt;li&gt;How to host a website locally&lt;/li&gt;
&lt;li&gt;How to debug directory issues, missing tools, and configuration errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By documenting all the mistakes I made, I hope this guide saves others time and frustration.&lt;/p&gt;

</description>
      <category>ubunt</category>
      <category>devop</category>
      <category>cloud</category>
      <category>nginx</category>
    </item>
    <item>
      <title>How to Deploy and Connect to an Azure VMSS</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Sat, 25 Oct 2025 17:30:53 +0000</pubDate>
      <link>https://dev.to/jic/how-to-deploy-and-connect-to-an-azure-vmss-5271</link>
      <guid>https://dev.to/jic/how-to-deploy-and-connect-to-an-azure-vmss-5271</guid>
      <description>&lt;p&gt;&lt;strong&gt;What is Azure VMSS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Virtual Machine Scale Set (VMSS)&lt;/strong&gt; is a &lt;strong&gt;Microsoft Azure service&lt;/strong&gt; that lets you deploy and manage &lt;strong&gt;a group of identical virtual machines (VMs)&lt;/strong&gt; — automatically.&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A smart cluster of servers that can grow or shrink depending on workload.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scaling&lt;/strong&gt;: Automatically adds/removes VMs based on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load balancing&lt;/strong&gt;: Distributes traffic evenly across VMs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High availability&lt;/strong&gt;: If one VM fails, others keep running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier management&lt;/strong&gt;: All instances share the same configuration and can be updated together.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;Imagine your app runs fine on 2 VMs during the day, but at night or during traffic spikes, you need 10.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;VMSS&lt;/strong&gt;, Azure can &lt;strong&gt;automatically scale&lt;/strong&gt; up when CPU &amp;gt; 70% and &lt;strong&gt;scale down&lt;/strong&gt; when traffic drops — no manual effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Components of a VMSS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Instance Template&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines the base image, size, and configuration of each VM.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scaling Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rules for how to increase or decrease the number of VMs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Balancer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Distributes incoming traffic across all VM instances.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Health Probe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitors VMs and removes unhealthy ones from the load balancer.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Types of Scaling
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Manual scaling&lt;/strong&gt; — You decide how many VMs to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic scaling&lt;/strong&gt; — Azure scales based on rules (e.g., CPU usage, memory, request count).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step-by-Step: How to Create a VMSS on Azure Portal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Go to the Azure Portal
&lt;/h3&gt;

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




&lt;h3&gt;
  
  
  🧰 Step 2: Search for "Virtual Machine Scale Sets"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In the search bar at the top, type &lt;strong&gt;Virtual Machine Scale Sets&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzccr82tc4dv0me46sl4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzccr82tc4dv0me46sl4a.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Step 3: Basics Tab
&lt;/h3&gt;

&lt;p&gt;Fill out the required info:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subscription&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your active Azure subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create new → &lt;code&gt;vmss-demo-rg&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Virtual machine scale set name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;myVMSS&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Region&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Choose closest to you (e.g., East US, West Europe)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Orchestration mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Uniform&lt;/strong&gt; (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ubuntu Server 22.04 LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VM Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard_B1s (cheap &amp;amp; small for demo) NB: Depending on the region, The size might not activate, therefore you might need to adjust select the appropriate zones&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then under &lt;strong&gt;Authentication type&lt;/strong&gt;, select &lt;strong&gt;Password&lt;/strong&gt; or &lt;strong&gt;SSH public key&lt;/strong&gt;.&lt;br&gt;
Under “Scaling policy”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;Custom autoscale&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scale out when CPU &amp;gt; 70% for 10 mins&lt;/li&gt;
&lt;li&gt;Scale in when CPU &amp;lt; 30% for 10 mins&lt;/li&gt;
&lt;li&gt;Minimum: 1 instance&lt;/li&gt;
&lt;li&gt;Maximum: 3 instances&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NB: I am using 2&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9vhrlqcw02m4xn0mrsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9vhrlqcw02m4xn0mrsj.png" alt=" " width="800" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsz7l4l75cu81w6qm1dvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsz7l4l75cu81w6qm1dvl.png" alt=" " width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiimr1nox4wfg4gos40u8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiimr1nox4wfg4gos40u8.png" alt=" " width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falucji1r08lgoz3qlivq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falucji1r08lgoz3qlivq.png" alt=" " width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🌐 Step 4: Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Leave &lt;strong&gt;Create new virtual network&lt;/strong&gt; selected.&lt;/li&gt;
&lt;li&gt;Load balancing: select &lt;strong&gt;Azure Load Balancer&lt;/strong&gt; (default).&lt;/li&gt;
&lt;li&gt;Health probe: leave automatic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4els5w3nb2lv9jnpuea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4els5w3nb2lv9jnpuea.png" alt=" " width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj1yq9q34pmcdno8enqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj1yq9q34pmcdno8enqb.png" alt=" " width="800" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Load Balancer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click on create new&lt;/strong&gt; if you have none and then give it a name. the rest of the data should be left on default. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizf7e30n1fwnwy1yl2yg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizf7e30n1fwnwy1yl2yg.png" alt=" " width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  💾 Step 6: Review + Create
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Wait for validation → Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If everything checks out you should have your VM successfully deployed&lt;/p&gt;

&lt;p&gt;Azure will deploy your VMSS — takes about &lt;strong&gt;5–7 minutes&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🚀 Step 7: Access Your VMSS
&lt;/h3&gt;

&lt;p&gt;Once it’s ready:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;VMSS Overview Page&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Instances&lt;/strong&gt; to view all running VMs&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Load Balancer public IP&lt;/strong&gt; in your browser — it connects to your VMSS backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you set up a load balancer, you can access the VMSS via its &lt;strong&gt;frontend public IP&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧪 Step 8: Test Scaling
&lt;/h3&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually increase instance count in the &lt;strong&gt;Scaling&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Or simulate load using:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;stress
  stress &lt;span class="nt"&gt;--cpu&lt;/span&gt; 2 &lt;span class="nt"&gt;--timeout&lt;/span&gt; 120
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 7: Verify and Access Your VMSS
&lt;/h2&gt;

&lt;p&gt;Once deployment completes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;VMSS Overview Page&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Instances&lt;/strong&gt; to view all running VMs&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Load Balancer public IP&lt;/strong&gt; in your browser — it connects to your VMSS backend.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 8: Simulate Load and Test Autoscaling
&lt;/h2&gt;

&lt;p&gt;SSH into your instance and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;stress &lt;span class="nt"&gt;-y&lt;/span&gt;
stress &lt;span class="nt"&gt;--cpu&lt;/span&gt; 2 &lt;span class="nt"&gt;--timeout&lt;/span&gt; 120
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a few minutes, Azure will detect high CPU usage and automatically scale up your VM count.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Auto-scaling&lt;/td&gt;
&lt;td&gt;Adjusts to traffic automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load balancing&lt;/td&gt;
&lt;td&gt;Ensures even distribution of requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High availability&lt;/td&gt;
&lt;td&gt;Handles failures gracefully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost-efficient&lt;/td&gt;
&lt;td&gt;Only pay for what you use&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;With Azure VMSS, you don’t have to manually add or remove servers.&lt;br&gt;
It scales intelligently, maintains uptime, and saves cost — all while being beginner-friendly to set up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#Azure #DevOps #Cloud #Scaling #VMSS&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>virtualmachine</category>
      <category>devops</category>
    </item>
    <item>
      <title>Deploying a simple NGINX web server on Azure and hosting a custom web page</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Sat, 18 Oct 2025 23:54:57 +0000</pubDate>
      <link>https://dev.to/jic/deploying-a-simple-nginx-web-server-on-a-azure-and-hosting-a-custom-web-page-4aig</link>
      <guid>https://dev.to/jic/deploying-a-simple-nginx-web-server-on-a-azure-and-hosting-a-custom-web-page-4aig</guid>
      <description>&lt;h2&gt;
  
  
  🧩 Overview
&lt;/h2&gt;

&lt;p&gt;This task involves setting up a GitHub workflow, deploying and configuring an NGINX web server, and serving a custom webpage accessible via a public IP or domain on port 80. The README.md in the main branch must include personal and project details, and the deployed index.html should display specified custom content. The server must be publicly accessible and remain live until grading is complete. The task is currently in progress.&lt;/p&gt;

&lt;p&gt;The goal is to deploy a simple &lt;strong&gt;NGINX web server&lt;/strong&gt; on a cloud platform and host a custom web page that displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The name and Slack username&lt;/li&gt;
&lt;li&gt;The cloud platform used&lt;/li&gt;
&lt;li&gt;The date of deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Platform:&lt;/strong&gt; Microsoft Azure&lt;br&gt;
&lt;strong&gt;Date Deployed:&lt;/strong&gt; 18/10/2025&lt;br&gt;
&lt;strong&gt;Server IP:&lt;/strong&gt; &lt;a href="http://172.191.198.160/" rel="noopener noreferrer"&gt;http://172.191.198.160/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🪜 Step 1 — Forking the Repository
&lt;/h2&gt;

&lt;p&gt;The first step was to fork the official repository:&lt;br&gt;
👉 &lt;a href="https://github.com/hng13-stage0-devops" rel="noopener noreferrer"&gt;hng13-stage0-devops&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the GitHub repo.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Fork&lt;/strong&gt; (top-right corner).&lt;/li&gt;
&lt;li&gt;The forked repo now appears under your own GitHub account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlhf8pe2y3uaw13uqp8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlhf8pe2y3uaw13uqp8r.png" alt=" " width="622" height="292"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🪜 Step 2 — Creating and Editing the README.md
&lt;/h2&gt;

&lt;p&gt;After forking, add a &lt;strong&gt;README.md&lt;/strong&gt; file to the main branch.&lt;br&gt;
This file contains my name, Slack username, a brief project description, and the server IP.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# HNG13 Stage 0 - DevOps Project&lt;/span&gt;

&lt;span class="gu"&gt;## 👤 Author&lt;/span&gt;
&lt;span class="gs"&gt;**Name:**&lt;/span&gt; Justice Obioha  
&lt;span class="gs"&gt;**Slack Username:**&lt;/span&gt; @JIC  
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## 🧠 Project Description&lt;/span&gt;
This project demonstrates the setup and deployment of an NGINX web server on &lt;span class="gs"&gt;**Microsoft Azure**&lt;/span&gt;.  
The server hosts a custom HTML page that confirms successful deployment and is publicly accessible on port 80.
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## 🌐 Deployment Information&lt;/span&gt;
&lt;span class="gs"&gt;**Platform:**&lt;/span&gt; Microsoft Azure  
&lt;span class="gs"&gt;**Server IP:**&lt;/span&gt; http://172.191.198.160/  
&lt;span class="gs"&gt;**Deployed:**&lt;/span&gt; October 18, 2025.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnppptryg5qar9gduurns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnppptryg5qar9gduurns.png" alt=" " width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🪜 Step 3 — Creating and Configuring the Virtual Machine (Azure)
&lt;/h2&gt;

&lt;p&gt;I deployed a &lt;strong&gt;Linux Virtual Machine&lt;/strong&gt; using &lt;strong&gt;Azure Portal&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Configuration:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Ubuntu 22.04 LTS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; SSH key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port Allowed:&lt;/strong&gt; 80 (HTTP)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Public IP:&lt;/strong&gt; &lt;code&gt;172.191.198.160&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;u&gt;First&lt;/u&gt; Open login in to you Azure Portal and click &lt;strong&gt;Virtual Machine&lt;/strong&gt; then &lt;strong&gt;Create&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flniavsoovlx481cimbdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flniavsoovlx481cimbdy.png" alt=" " width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Fill in the details&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kc5uxktip3l2hg8ckxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kc5uxktip3l2hg8ckxk.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Click Review + Create&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpkc3uu9qbwvsisa9iyb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpkc3uu9qbwvsisa9iyb.png" alt=" " width="800" height="703"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;After review and accepting price cost click on **Create&lt;/u&gt;&lt;/strong&gt;**&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9bap7j5v1vehbrjr0u6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9bap7j5v1vehbrjr0u6.png" alt=" " width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;If successful Then Click on &lt;strong&gt;Go to Resource&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmkwadz6tsq9w7zccj1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmkwadz6tsq9w7zccj1w.png" alt=" " width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Go to Overview and copy you Public IP&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🪜 Step 4 — Connecting to the Server via SSH
&lt;/h2&gt;

&lt;p&gt;Using the Azure-provided SSH command, I connected to my VM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh jic-hng@172.191.198.160
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ry5g0w0x4yoyg84hm19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ry5g0w0x4yoyg84hm19.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🪜 Step 5 — Installing and Running NGINX
&lt;/h2&gt;

&lt;p&gt;Once connected, I installed and enabled NGINX using the commands below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify that NGINX was running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, I visited &lt;code&gt;http://172.191.198.160/&lt;/code&gt; and saw the &lt;strong&gt;default “Welcome to nginx!”&lt;/strong&gt; page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0g7soshgtya22h34speb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0g7soshgtya22h34speb.png" alt=" " width="745" height="427"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🪜 Step 6 — Replacing the Default HTML Page
&lt;/h2&gt;

&lt;p&gt;Next, I replaced the default file located at &lt;code&gt;/var/www/html/index.nginx-debian.html&lt;/code&gt; with my custom &lt;code&gt;index.html&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html
&lt;span class="nb"&gt;sudo rm &lt;/span&gt;index.nginx-debian.html
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I added this HTML content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Welcome to DevOps Stage 0&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Welcome to DevOps Stage 0 - Justice Obioha / @JIC&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Successfully deployed on Azure&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Deployed: 18/10/2025&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving with &lt;code&gt;Ctrl + O&lt;/code&gt;, &lt;code&gt;Enter&lt;/code&gt;, and &lt;code&gt;Ctrl + X&lt;/code&gt;, I verified my page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41b6ffdyqaza5kg4pt3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41b6ffdyqaza5kg4pt3r.png" alt=" " width="798" height="385"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cloud deployment is simple when broken into clear steps.&lt;/li&gt;
&lt;li&gt;NGINX serves as an excellent lightweight web server for testing deployments.&lt;/li&gt;
&lt;li&gt;Small details (like date format) matter in automated validation environments.&lt;/li&gt;
&lt;li&gt;Proper documentation makes future tasks easier and more professional.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Summary of Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update system&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update

&lt;span class="c"&gt;# Install NGINX&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Start and enable the service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx

&lt;span class="c"&gt;# Replace default HTML&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html
&lt;span class="nb"&gt;sudo rm &lt;/span&gt;index.nginx-debian.html
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Final Output
&lt;/h2&gt;

&lt;p&gt;Visit: &lt;strong&gt;&lt;a href="http://172.191.198.160/" rel="noopener noreferrer"&gt;http://172.191.198.160/&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
You’ll see:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Welcome to DevOps Stage 0 - Justice Obioha / &lt;a class="mentioned-user" href="https://dev.to/jic"&gt;@jic&lt;/a&gt;&lt;br&gt;
Successfully deployed on Azure&lt;br&gt;
Deployed: 18/10/2025”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oshlpv39yyanvis12xo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oshlpv39yyanvis12xo.png" alt=" " width="798" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏁 Conclusion
&lt;/h2&gt;

&lt;p&gt;This project helped me understand how to deploy and manage a simple web server using Azure and NGINX.&lt;br&gt;
It’s a solid foundation for more advanced DevOps tasks like CI/CD, monitoring, and containerization in my cloud computing journey&lt;/p&gt;

&lt;h1&gt;
  
  
  Webserver #NGINX #DEVOPS #AZURE #Linux
&lt;/h1&gt;

</description>
      <category>cloudcomputing</category>
      <category>azure</category>
      <category>cloudskills</category>
      <category>nginx</category>
    </item>
    <item>
      <title># Cloud Resume Challenge (Azure) — PArt 3: Setting Up HTTPS and Understanding Azure CDN</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Sat, 18 Oct 2025 23:25:44 +0000</pubDate>
      <link>https://dev.to/jic/-cloud-resume-challenge-azure-part-3-setting-up-https-and-understanding-azure-cdn-503g</link>
      <guid>https://dev.to/jic/-cloud-resume-challenge-azure-part-3-setting-up-https-and-understanding-azure-cdn-503g</guid>
      <description>&lt;p&gt;Stage 5 of the &lt;strong&gt;Cloud Resume Challenge (Azure Edition)&lt;/strong&gt; focuses on securing your website with HTTPS and improving global performance using &lt;strong&gt;Azure CDN (Content Delivery Network)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This stage helped me understand not just how to enable HTTPS, but also how CDN, caching, and compression come together to make a website faster and more reliable.&lt;/p&gt;

&lt;p&gt;Below is my &lt;strong&gt;step-by-step process&lt;/strong&gt;, what I learned, and how I handled the challenges that came up along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step Procedure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Understanding the Goal
&lt;/h3&gt;

&lt;p&gt;The main goal of this stage was to add &lt;strong&gt;HTTPS&lt;/strong&gt; and improve the performance of my static website hosted on Azure Storage.&lt;/p&gt;

&lt;p&gt;My current site was already live at:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://myresumejic.z19.web.core.windows.net/" rel="noopener noreferrer"&gt;https://myresumejic.z19.web.core.windows.net/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;However, this endpoint does not support HTTPS by default.&lt;br&gt;
To fix this, Azure recommends placing a &lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt; in front of your static site to handle HTTPS requests and deliver cached content faster to users.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Learning What a CDN Does
&lt;/h3&gt;

&lt;p&gt;Before jumping into the setup, I took some time to understand what a CDN actually does.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;CDN&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores cached copies of your website on global edge servers closer to users.&lt;/li&gt;
&lt;li&gt;Provides &lt;strong&gt;HTTPS&lt;/strong&gt; and &lt;strong&gt;SSL/TLS certificates&lt;/strong&gt; automatically.&lt;/li&gt;
&lt;li&gt;Reduces latency, so pages load faster.&lt;/li&gt;
&lt;li&gt;Offloads requests from the origin (Azure Storage).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also learned that enabling &lt;strong&gt;compression&lt;/strong&gt; helps reduce file sizes for text-based files (HTML, CSS, JavaScript), while &lt;strong&gt;caching&lt;/strong&gt; makes frequently requested content load instantly from the nearest server.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Blog Tip:&lt;/strong&gt;&lt;br&gt;
“I also enabled file compression on my CDN endpoint to reduce load time and bandwidth. Azure automatically uses Gzip and Brotli for text-based content, which complements caching for optimal performance.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Step 3: Attempting to Create the CDN Profile
&lt;/h3&gt;

&lt;p&gt;After understanding the concept, I opened the Azure Portal and searched for:&lt;br&gt;
&lt;strong&gt;Front Door and CDN profiles → + Create&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I entered the following details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;myresumejic-cdn&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier:&lt;/strong&gt; Standard Microsoft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Origin:&lt;/strong&gt; &lt;code&gt;myresumejic.z19.web.core.windows.net&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I clicked &lt;strong&gt;Review + Create&lt;/strong&gt;, but Azure immediately displayed this message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Microsoft.CDN is not registered for the subscription.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Step 4: Registering the CDN Resource Provider
&lt;/h3&gt;

&lt;p&gt;Azure requires each service to be registered under a &lt;em&gt;resource provider namespace&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here’s how I fixed it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I navigated to &lt;strong&gt;Subscriptions → My Subscription → Resource Providers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;I searched for &lt;code&gt;Microsoft.CDN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I clicked &lt;strong&gt;Register&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;After about a minute, the status changed from &lt;em&gt;Not Registered&lt;/em&gt; to &lt;em&gt;Registered&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This allowed me to continue with the CDN setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI Alternative:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az provider register &lt;span class="nt"&gt;--namespace&lt;/span&gt; Microsoft.CDN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it showed &lt;code&gt;Registered&lt;/code&gt;, I retried creating the CDN profile.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Hitting Another Error — Account Restriction
&lt;/h3&gt;

&lt;p&gt;This time, the deployment failed again, but with a new message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Free Trial and Student account is forbidden for Azure Front Door resources.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s when I realized that Azure had merged the &lt;strong&gt;CDN&lt;/strong&gt; service with &lt;strong&gt;Front Door&lt;/strong&gt;, and currently &lt;strong&gt;Free Trial&lt;/strong&gt; or &lt;strong&gt;Student&lt;/strong&gt; subscriptions are restricted from creating these resources.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Making an Informed Decision
&lt;/h3&gt;

&lt;p&gt;After researching and reading documentation, I confirmed this wasn’t a temporary bug — it’s a known limitation.&lt;/p&gt;

&lt;p&gt;So, I made the decision to &lt;strong&gt;pause HTTPS setup temporarily&lt;/strong&gt; and move forward with the next stages of the challenge (backend and database).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Blog Note:&lt;/strong&gt;&lt;br&gt;
“Azure Front Door (CDN) is currently restricted on Free Trial and Student subscriptions. To keep progressing, I’ve decided to continue to the backend stages first and will enable HTTPS later once I migrate to a Pay-As-You-Go plan or Azure Static Web Apps. This doesn’t affect the functionality of the Cloud Resume Challenge — it’s only a temporary pause on the HTTPS stage.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This decision allowed me to stay productive and continue the challenge without losing momentum.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Resource Providers&lt;/strong&gt;&lt;br&gt;
Every major Azure service belongs to a namespace that must be registered before use.&lt;br&gt;
Example: &lt;code&gt;Microsoft.CDN&lt;/code&gt; for CDN/Front Door, &lt;code&gt;Microsoft.Storage&lt;/code&gt; for Blob, &lt;code&gt;Microsoft.Web&lt;/code&gt; for App Services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Subscription Tiers Have Limits&lt;/strong&gt;&lt;br&gt;
Free and Student accounts cannot use some premium global services (like Front Door/CDN).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CDN Concepts: Caching &amp;amp; Compression&lt;/strong&gt;&lt;br&gt;
I learned how caching and compression work together to speed up content delivery and reduce bandwidth costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptability Is Key&lt;/strong&gt;&lt;br&gt;
Cloud engineering often involves service limitations — being able to research and find workarounds is just as important as completing the setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Tips for Others Doing This Stage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tip 1:&lt;/strong&gt; Register all needed providers early (&lt;code&gt;Microsoft.CDN&lt;/code&gt;, &lt;code&gt;Microsoft.Web&lt;/code&gt;, &lt;code&gt;Microsoft.Network&lt;/code&gt;, &lt;code&gt;Microsoft.Storage&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip 2:&lt;/strong&gt; If your free subscription blocks Front Door/CDN, continue the challenge and complete backend stages first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip 3:&lt;/strong&gt; Consider using &lt;strong&gt;Azure Static Web Apps&lt;/strong&gt; — it provides free HTTPS and global delivery out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip 4:&lt;/strong&gt; Always document what went wrong and how you fixed it. That’s how you build true cloud troubleshooting experience.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;Although I couldn’t enable HTTPS in this stage, I learned valuable lessons about Azure’s architecture, resource provider registration, subscription limitations, and the logic behind CDN performance settings.&lt;/p&gt;

&lt;p&gt;I also realized that real cloud work isn’t always about reaching the goal on the first try — it’s about learning, adapting, and moving forward intelligently.&lt;/p&gt;

&lt;p&gt;Next, I’ll begin &lt;strong&gt;Stage 6&lt;/strong&gt;, where I’ll integrate my frontend with a backend visitor counter using &lt;strong&gt;Azure Functions&lt;/strong&gt; and &lt;strong&gt;Cosmos DB&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloud #Azure #DevOps #CloudResumeChallenge #LearningInPublic
&lt;/h1&gt;




&lt;p&gt;Would you like me to add a &lt;strong&gt;simple diagram (User → CDN → Azure Storage)&lt;/strong&gt; under Step 2 to visually show how CDN works? It’ll make your post look more professional on Dev.to.&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>azure</category>
      <category>cloud</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>Cloud Resume Challenge (Azure) — Part 3: Setting Up HTTPS and Understanding Azure CDN</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Wed, 08 Oct 2025 23:07:45 +0000</pubDate>
      <link>https://dev.to/jic/cloud-resume-challenge-azure-part-3-setting-up-https-and-understanding-azure-cdn-2mbk</link>
      <guid>https://dev.to/jic/cloud-resume-challenge-azure-part-3-setting-up-https-and-understanding-azure-cdn-2mbk</guid>
      <description>&lt;p&gt;Stage 5 of the &lt;strong&gt;Cloud Resume Challenge (Azure Edition)&lt;/strong&gt; focuses on securing your website with HTTPS and improving global performance using &lt;strong&gt;Azure CDN (Content Delivery Network)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This stage helped me understand not just how to enable HTTPS, but also how CDN, caching, and compression come together to make a website faster and more reliable.&lt;/p&gt;

&lt;p&gt;Below is my &lt;strong&gt;step-by-step process&lt;/strong&gt;, what I learned, and how I handled the challenges that came up along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step Procedure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Understanding the Goal
&lt;/h3&gt;

&lt;p&gt;The main goal of this stage was to add &lt;strong&gt;HTTPS&lt;/strong&gt; and improve the performance of my static website hosted on Azure Storage.&lt;/p&gt;

&lt;p&gt;My current site was already live at:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://myresumejic.z19.web.core.windows.net/" rel="noopener noreferrer"&gt;https://myresumejic.z19.web.core.windows.net/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;However, this endpoint does not support HTTPS by default.&lt;br&gt;
To fix this, Azure recommends placing a &lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt; in front of your static site to handle HTTPS requests and deliver cached content faster to users.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Learning What a CDN Does
&lt;/h3&gt;

&lt;p&gt;Before jumping into the setup, I took some time to understand what a CDN actually does.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;CDN&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores cached copies of your website on global edge servers closer to users.&lt;/li&gt;
&lt;li&gt;Provides &lt;strong&gt;HTTPS&lt;/strong&gt; and &lt;strong&gt;SSL/TLS certificates&lt;/strong&gt; automatically.&lt;/li&gt;
&lt;li&gt;Reduces latency, so pages load faster.&lt;/li&gt;
&lt;li&gt;Offloads requests from the origin (Azure Storage).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also learned that enabling &lt;strong&gt;compression&lt;/strong&gt; helps reduce file sizes for text-based files (HTML, CSS, JavaScript), while &lt;strong&gt;caching&lt;/strong&gt; makes frequently requested content load instantly from the nearest server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Attempting to Create the CDN Profile
&lt;/h3&gt;

&lt;p&gt;After understanding the concept, I opened the Azure Portal and searched for:&lt;br&gt;
&lt;strong&gt;Front Door and CDN profiles → + Create&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I entered the following details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;myresumejic-cdn&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier:&lt;/strong&gt; Standard Microsoft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Origin:&lt;/strong&gt; &lt;code&gt;myresumejic.z19.web.core.windows.net&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;
“I also enabled file compression on my CDN endpoint to reduce load time and bandwidth. Azure automatically uses Gzip and Brotli for text-based content, which complements caching for optimal performance.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I clicked &lt;strong&gt;Review + Create&lt;/strong&gt;, but Azure immediately displayed this message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Microsoft.CDN is not registered for the subscription.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NB: I missed saving the screenshot; however, it is a red note under the subscription selection box.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: I had to Register the CDN Resource Provider
&lt;/h3&gt;

&lt;p&gt;Azure requires each service to be registered under a &lt;em&gt;resource provider namespace&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here’s how I fixed it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I navigated to &lt;strong&gt;Subscriptions - My Subscription - Settings - Resource Providers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;I searched for &lt;code&gt;Microsoft.CDN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I clicked &lt;strong&gt;Register&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;After about a minute, the status changed from &lt;em&gt;Not Registered&lt;/em&gt; to &lt;em&gt;Registered&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This allowed me to continue with the CDN setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pe0fc89cep0lubmzljg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pe0fc89cep0lubmzljg.png" alt=" " width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After this stage, you should back to stage 3 again and create the CDN Profile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdg846btrro54lcvfe51l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdg846btrro54lcvfe51l.png" alt="Data for the Creating the CDN Profile" width="792" height="931"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Hitting Another Error — Account Restriction
&lt;/h3&gt;

&lt;p&gt;This time, the deployment failed again, but with a new message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Free Trial and Student account is forbidden for Azure Front Door resources.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s when I realized that Azure merging the &lt;strong&gt;CDN&lt;/strong&gt; service with &lt;strong&gt;Front Door&lt;/strong&gt;, and currently &lt;strong&gt;Free Trial&lt;/strong&gt; or &lt;strong&gt;Student&lt;/strong&gt; subscriptions are restricted from creating these resources.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Making an Informed Decision
&lt;/h3&gt;

&lt;p&gt;After researching and reading documentation, I confirmed this is a general limitation.&lt;/p&gt;

&lt;p&gt;So, I made the decision to &lt;strong&gt;pause HTTPS setup temporarily&lt;/strong&gt; and move forward with the next stages of the challenge (backend and database).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
“Azure Front Door (CDN) is currently restricted on Free Trial and Student subscriptions. To keep progressing, I’ve decided to continue to the backend stages first and will enable HTTPS later once I migrate to a Pay-As-You-Go plan or Azure Static Web Apps. This doesn’t affect the functionality of the Cloud Resume Challenge — it’s only a temporary pause on the HTTPS stage.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This decision allowed me to stay productive and continue the challenge without losing momentum.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Resource Providers&lt;/strong&gt;&lt;br&gt;
Every major Azure service belongs to a namespace that must be registered before use.&lt;br&gt;
Example: &lt;code&gt;Microsoft.CDN&lt;/code&gt; for CDN/Front Door, &lt;code&gt;Microsoft.Storage&lt;/code&gt; for Blob, &lt;code&gt;Microsoft.Web&lt;/code&gt; for App Services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Subscription Tiers Have Limits&lt;/strong&gt;&lt;br&gt;
Free and Student accounts cannot use some premium global services (like Front Door/CDN).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CDN Concepts: Caching &amp;amp; Compression&lt;/strong&gt;&lt;br&gt;
I learned how caching and compression work together to speed up content delivery and reduce bandwidth costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptability Is Key&lt;/strong&gt;&lt;br&gt;
Cloud engineering often involves service limitations — being able to research and find workarounds is just as important as completing the setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Tips for Others Doing This Stage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tip 1:&lt;/strong&gt; Register all needed providers early (&lt;code&gt;Microsoft.CDN&lt;/code&gt;, &lt;code&gt;Microsoft.Web&lt;/code&gt;, &lt;code&gt;Microsoft.Network&lt;/code&gt;, &lt;code&gt;Microsoft.Storage&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip 2:&lt;/strong&gt; If your free subscription blocks Front Door/CDN, continue the challenge and complete backend stages first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip 3:&lt;/strong&gt; Consider using &lt;strong&gt;Azure Static Web Apps&lt;/strong&gt; — it provides free HTTPS and global delivery out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip 4:&lt;/strong&gt; Always document what went wrong and how you fixed it. That’s how you build true cloud troubleshooting experience.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;Although I couldn’t enable HTTPS in this stage, I learned valuable lessons about Azure’s architecture, resource provider registration, subscription limitations, and the logic behind CDN performance settings.&lt;/p&gt;

&lt;p&gt;I also realized that real cloud work isn’t always about reaching the goal on the first try — it’s about learning, adapting, and moving forward intelligently.&lt;/p&gt;

&lt;p&gt;Next, I’ll begin &lt;strong&gt;Stage 6&lt;/strong&gt;, where I’ll integrate my frontend with a backend visitor counter using &lt;strong&gt;Azure Functions&lt;/strong&gt; and &lt;strong&gt;Cosmos DB&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloud #Azure #DevOps #CloudResumeChallenge #LearningInPublic
&lt;/h1&gt;




</description>
      <category>cloudcomputing</category>
      <category>azure</category>
      <category>cloud</category>
    </item>
    <item>
      <title># Cloud Resume Challenge (Azure) - Part 2: Hosting My Resume Website</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Mon, 06 Oct 2025 20:34:15 +0000</pubDate>
      <link>https://dev.to/jic/-cloud-resume-challenge-azure-part-2-hosting-my-resume-website-51pl</link>
      <guid>https://dev.to/jic/-cloud-resume-challenge-azure-part-2-hosting-my-resume-website-51pl</guid>
      <description>&lt;p&gt;Today I reached &lt;strong&gt;Stage 4&lt;/strong&gt; of the Cloud Resume Challenge — getting my &lt;strong&gt;resume website hosted on Azure Blob Storage&lt;/strong&gt; as a static site. This is the stage where all the work from earlier (HTML, CSS, responsive design, and content integration) finally comes alive on the internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Goal
&lt;/h2&gt;

&lt;p&gt;The main goal of this stage was to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload my HTML/CSS resume website to &lt;strong&gt;Azure Storage&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;static website hosting&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Make sure my page can be accessed over the internet using the Azure-provided endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the first real step where my resume left my local machine and became available online.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What I Did
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Created a Storage Account in Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Storage name: &lt;strong&gt;&lt;code&gt;myresumejic&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Region: West Europe (you can choose nearest region incase you get an error just change location).&lt;/li&gt;
&lt;li&gt;Performance: Standard, Redundancy: LRS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vf27suyc9kesdpp3fsu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vf27suyc9kesdpp3fsu.png" alt=" " width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enabled Static Website Hosting&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure Portal, click on &lt;strong&gt;Data Management&lt;/strong&gt; then click on &lt;em&gt;Static Website&lt;/em&gt; under my storage account.&lt;/li&gt;
&lt;li&gt;Enabled the feature.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;index.html&lt;/code&gt; as the main document and &lt;code&gt;404.html&lt;/code&gt; as the error document.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91w6j8vouz2y5trjfrsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91w6j8vouz2y5trjfrsp.png" alt=" " width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Uploaded My Files&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Uploaded &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, and &lt;code&gt;404.html&lt;/code&gt; into the &lt;code&gt;$web&lt;/code&gt; container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;em&gt;Screenshot: &lt;code&gt;$web&lt;/code&gt; container showing index.html, style.css, and 404.html&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tested the Endpoint&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Azure generated a public URL:
 👉 &lt;strong&gt;&lt;a href="https://myresumejic.z19.web.core.windows.net/" rel="noopener noreferrer"&gt;https://myresumejic.z19.web.core.windows.net/&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
     * When I visited it in the browser, I saw &lt;strong&gt;my resume live for the first time!&lt;/strong&gt; 🎉
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How I Achieved It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Followed the official Microsoft docs on &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blob-static-website" rel="noopener noreferrer"&gt;Static Website Hosting in Azure Storage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Used the Azure Portal upload for simplicity (later I’ll automate with Azure CLI / GitHub Actions).&lt;/li&gt;
&lt;li&gt;Ensured consistent naming since Azure is case-sensitive.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Case Sensitivity&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Problem&lt;/em&gt;: CSS didn’t load at first because of mismatched file names (&lt;code&gt;Style.css&lt;/code&gt; vs &lt;code&gt;style.css&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Solution&lt;/em&gt;: Renamed everything consistently to lowercase.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Browser Caching&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Problem&lt;/em&gt;: After re-uploading, my browser showed old content.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Solution&lt;/em&gt;: Cleared cache. Later, Azure CDN (Stage 5) will solve this properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;File Paths&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Problem&lt;/em&gt;: At first, index.html didn’t find my CSS.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Solution&lt;/em&gt;: Used relative paths (&lt;code&gt;href="style.css"&lt;/code&gt;) since Azure serves files directly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📌 Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stage 5&lt;/strong&gt; → Add &lt;strong&gt;HTTPS&lt;/strong&gt; support with Azure CDN.&lt;/li&gt;
&lt;li&gt;Configure a &lt;strong&gt;custom domain&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Start building the &lt;strong&gt;Azure Function (Python)&lt;/strong&gt; for the visitor counter.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌟 Reflection
&lt;/h2&gt;

&lt;p&gt;This stage was exciting because it’s the &lt;strong&gt;first time my resume was truly online on Azure&lt;/strong&gt;. For now, it’s basic (no HTTPS, no custom domain), but it’s a major milestone. From here, I’ll improve the site with security, custom branding, and a dynamic backend.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloud #Azure #DevOps #CloudResumeChallenge #100DaysOfCloud
&lt;/h1&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Cloud Resume Challenge Azure - Part 1</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Mon, 29 Sep 2025 21:49:52 +0000</pubDate>
      <link>https://dev.to/jic/cloud-resume-challenge-azure-part-1-21im</link>
      <guid>https://dev.to/jic/cloud-resume-challenge-azure-part-1-21im</guid>
      <description>&lt;p&gt;I have been wanting to do this for a while. Now I have officially kicked off the &lt;strong&gt;Cloud Resume Challenge (Azure edition)&lt;/strong&gt;. This is a hands-on project where I wouldbuild and host my personal resume on the cloud (Azure), step by step, using modern DevOps practices.&lt;/p&gt;

&lt;p&gt;Today was &lt;strong&gt;front-end day&lt;/strong&gt; — designing, coding, and structuring my resume website as the foundation of everything else to come.&lt;/p&gt;




&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;p&gt;The goal was to create a &lt;strong&gt;functional, modern, and responsive web page&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Displays my resume and portfolio details.&lt;/li&gt;
&lt;li&gt;Introduces me as a cloud/IT enthusiast.&lt;/li&gt;
&lt;li&gt;Has a clear &lt;strong&gt;navigation structure&lt;/strong&gt; (Home, About, Projects, CV, Contact) I might decide to add more later on.&lt;/li&gt;
&lt;li&gt;Create the HTML and Style with the CSS.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;How I Achieve this?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Created HTML Structure&lt;/strong&gt;
NB: I had previous experience in web-development, i.e. HTML, CSS. So it was easy to blend along.  However, "ChatGPT" was a resource for the rescue. &lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Wrote the main sections: Hero (intro), About, Projects, CV/Experience, and Contact.&lt;/li&gt;
&lt;li&gt;Used semantic HTML5 (&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;) to keep the page clean.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example of my navigation bar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#home"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#projects"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Projects&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#cv"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;CV&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Added Styling with CSS&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defined a &lt;strong&gt;dark theme&lt;/strong&gt; with Azure-inspired colours:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt; &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
   &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tahoma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="nc"&gt;.navbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* matches body background */&lt;/span&gt;
   &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Integrated Resume Content&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;strong&gt;About Me&lt;/strong&gt; summary, &lt;strong&gt;Projects&lt;/strong&gt;, &lt;strong&gt;CV&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;*I Created a placeholder &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; that will later display live visitor counts: ( This was suppose to be a step further down the line, i only added a place holder now which is to be effected later)&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"visitors"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Visitor Counter&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This page has been viewed 
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"visitor-count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; times.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Linked a &lt;code&gt;counter.js&lt;/code&gt; file so the counter can fetch data once the backend is live.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠 How I Achieved It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt;: Divided content into logical sections with unique IDs for smooth scrolling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS&lt;/strong&gt;: Styled the navbar to match the background, applied flexbox layouts, and added responsive &lt;code&gt;@media&lt;/code&gt; queries for smaller screens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt;: Used &lt;a href="https://fontawesome.com/" rel="noopener noreferrer"&gt;Font Awesome&lt;/a&gt; for LinkedIn, GitHub, and email icons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume Data&lt;/strong&gt;: Highlighted my &lt;strong&gt;Skill set&lt;/strong&gt;, emphasizing IT and cloud-relevant skills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visitor Counter&lt;/strong&gt;: Designed the placeholder, ready for integration with Azure Functions.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*&lt;em&gt;However, Below are Some Challenges I Faced and How I Resolved them Solutions&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Navbar Transparency Issue&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Problem&lt;/em&gt;: The navbar text overlapped content when scrolling making it less clean.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Solution&lt;/em&gt;: Applied a matching background (&lt;code&gt;#111&lt;/code&gt;) + subtle shadow.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mobile Responsiveness&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Problem&lt;/em&gt;: Layout broke on smaller screens. While i needed it to be responsive on all media devices&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Solution&lt;/em&gt;: Added &lt;code&gt;@media&lt;/code&gt; queries like:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight css"&gt;&lt;code&gt; &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="nc"&gt;.navbar&lt;/span&gt; &lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Visitor Counter Timing&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Problem&lt;/em&gt;: Should I implement it now or later?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Solution&lt;/em&gt;: Followed the Cloud Resume Challenge steps → added the placeholder only. The backend (Azure Function + Cosmos DB) will come later.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;What is My Next Step?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I Would Deploy this static site to &lt;strong&gt;Azure Storage (Static Website)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure &lt;strong&gt;HTTPS&lt;/strong&gt; and set up a &lt;strong&gt;custom domain&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Build an &lt;strong&gt;Azure Function (Python)&lt;/strong&gt; with Cosmos DB for the visitor counter.&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;counter.js&lt;/code&gt; to fetch live data from the API.&lt;/li&gt;
&lt;li&gt;Automate deployments using &lt;strong&gt;GitHub Actions&lt;/strong&gt; and define resources with &lt;strong&gt;Bicep/ARM templates&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Reflection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This stage was about &lt;strong&gt;laying the foundation&lt;/strong&gt;. I now have a working resume page that reflects my cloud journey and is ready for deployment. Later on I’ll move into Azure hosting and start tackling backend integration.&lt;/p&gt;

&lt;p&gt;NB: Most of the parts of this stage can be tackled using the right questions on ChatGPT or any AI resource of your choice. It help and to make the job faster, however jsut be sure you understand what you are implementing.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloud #Azure #DevOps #CloudResumeChallenge
&lt;/h1&gt;

</description>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>azure</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Create and Attach a Disk to Your Azure Virtual Machine</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Sat, 13 Sep 2025 03:04:12 +0000</pubDate>
      <link>https://dev.to/jic/how-to-create-and-attach-a-disk-to-your-azure-virtual-machine-2p7k</link>
      <guid>https://dev.to/jic/how-to-create-and-attach-a-disk-to-your-azure-virtual-machine-2p7k</guid>
      <description>&lt;p&gt;When working with Azure Virtual Machines (VMs), storage plays a critical role. By default, every VM comes with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An OS disk (for the operating system).&lt;/li&gt;
&lt;li&gt;A temporary disk (for temporary data).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But often, you’ll need extra storage — maybe for databases, logs, or application data. This is where data disks come in. In this post, we’ll walk through how to create and attach a new disk to your VM in the Azure Portal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Navigate to Your Virtual Machine&lt;/strong&gt;&lt;br&gt;
Believing that you already have an Azure account and have a VM  created. If not, learn how to create one &lt;a href="https://dev.tourl"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the left-hand menu, select Virtual Machines. Choose the VM you want to attach the disk to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1mkmpy602k4mz96nyh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1mkmpy602k4mz96nyh9.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Add a New Disk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the VM’s navigation menu, scroll down and click Disks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0vktzs2zltuv2ae9lua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0vktzs2zltuv2ae9lua.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click + Create and attach a new disk. Iin the blue box. However if you already have a Data Disk previously created, you can easily attach it with the "attach existing disk" just beside. &lt;/p&gt;

&lt;p&gt;After clicking "Create and attach a new disk" you will see the disk information pop out as in the red box in the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpspkudizqwc1a70nyrb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpspkudizqwc1a70nyrb8.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;** Step 3: Configure the New Disk** &lt;br&gt;
This where you fill in the modalities of the disk. You’ll need to specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disk name → Something descriptive (e.g., TestDk).&lt;/li&gt;
&lt;li&gt;Storage type → As preferred and available. Depending on needs.&lt;/li&gt;
&lt;li&gt;Size → Choose according to your needs (e.g., 8GB).&lt;/li&gt;
&lt;li&gt;Encryption → Platform-managed key&lt;/li&gt;
&lt;li&gt;Hosting Caching → Read/Write (SO that it is readable and editable}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click Appy Below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpspkudizqwc1a70nyrb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpspkudizqwc1a70nyrb8.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There you have it... You have created and attached your first data disk.&lt;/p&gt;

&lt;p&gt;However, you would need to optimise/Initialise your disk into the VM. How do you do so? Follow the steps below: &lt;/p&gt;

&lt;p&gt;🔹 Step 5: Initialize/Optimise the Disk Inside the VM&lt;/p&gt;

&lt;p&gt;The disk is attached but not yet usable. You need to initialize/Optimise and format it from inside the VM. Depending on you VM registration method. This can be changed by clicking edit setting in the connect section. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z1fnecdcj03d56x6dwa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z1fnecdcj03d56x6dwa.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you used pass word. Then you can easily log into you machine. However, if it was through SSH Key, then you would have to download .pem file  and load form there. In this case we use password. If you have forgotten your password, just like i did!!! You can reset it by clicking the reset password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folz5pjrkg8wt0xpk7std.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folz5pjrkg8wt0xpk7std.png" alt=" " width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open your Windows PowerShell&lt;/strong&gt; &lt;br&gt;
You would have to login into you vm as seen below: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2wm1cs1uqgpsur713wi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2wm1cs1uqgpsur713wi.png" alt=" " width="800" height="533"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Ref... The yellow boxes are my inputs. While the red arrows were the errors i encountered. &lt;/p&gt;

&lt;p&gt;I.e, My Vm wasn't running, so i had to go back to azure to connect it. Therefore, your marching must be running before you can connect it on your PowerShell.&lt;/p&gt;

&lt;p&gt;The other error was I forgot my password, which I showed you how to reset above. It everything woks right, you should see the welcome info meaning you are successfully in.&lt;/p&gt;

&lt;p&gt;Now unto optimising the disk. Us the commands below to do so. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Check the disk&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; sudo lsblk -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedb6rvfc06x9qj15rk6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedb6rvfc06x9qj15rk6i.png" alt=" " width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shows all disks. Look for /dev/sdc1 (or similar).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We would have to Format the data disk (TestDk) (only if it’s a new/empty disk)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkfs.ext4 -F /dev/sdc1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzultiidn6o870j8vdmlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzultiidn6o870j8vdmlq.png" alt=" " width="800" height="198"&gt;&lt;/a&gt;&lt;br&gt;
Creates an ext4 filesystem. Skip this if the disk already has data. like in my case I already have it available. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now we have to Create a mount point. First you have to create the directory. Do so with command:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkdir -p /mnt/TestDk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ctyl01zcnjm9ax18u1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ctyl01zcnjm9ax18u1i.png" alt=" " width="741" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now Mount the disk with:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mount /dev/sdc1 /mnt/TestDk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqhd2470etspsgzpcwe9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqhd2470etspsgzpcwe9.png" alt=" " width="730" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To confirm you are doing everything right. Imput the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df -h | grep TestDk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4h0ptu953nm4m9vagqu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4h0ptu953nm4m9vagqu0.png" alt=" " width="469" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;REF:--- Breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/dev/sdc1 → the attached disk partition.&lt;/li&gt;
&lt;li&gt;16G → total size of the disk.&lt;/li&gt;
&lt;li&gt;36K → space used (basically empty).&lt;/li&gt;
&lt;li&gt;15G → available free space.&lt;/li&gt;
&lt;li&gt;1% → usage percentage.&lt;/li&gt;
&lt;li&gt;/mnt/TestDk → the folder where it’s mounted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should see /dev/sdc1 mounted to /mnt/TestDk.&lt;/p&gt;

&lt;p&gt;NB: Usually after mounting a disk. and optimising it on linux, usuually, at the reboot of the VM, the Data Disk disconnect. To avoid that, we would apply a command that make sure and the start of the VM, the Data disk boots with it. You achieve that with step 5.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make it persistent (auto-mount after reboot)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo blkid /dev/sdc1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81m80xkynnqkb32c2kg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81m80xkynnqkb32c2kg7.png" alt=" " width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you, got the information as in the image above, then you are on the right part. &lt;/p&gt;

&lt;p&gt;Then you can confirm using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df -h | grep TestDk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqxf6z1qpwaijqu6isxnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqxf6z1qpwaijqu6isxnw.png" alt=" " width="582" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do get the disk information  above, then you might want to check how many disk mounted using :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mount | grep sdc1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdtgbz1axyw2rzaw4d5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdtgbz1axyw2rzaw4d5l.png" alt=" " width="790" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have more than one as the above, you would have to unmount 1. Use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo umount -l  /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to unmount it &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wjm08cn07hvhzokf9tc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wjm08cn07hvhzokf9tc.png" alt=" " width="550" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thereafter, reconfirm, then run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df -h | grep TestDk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vmtdo3ds99g54c1fdx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vmtdo3ds99g54c1fdx0.png" alt=" " width="475" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There you go!!! You have add a disk and optimised it for your Linux VM. &lt;/p&gt;

&lt;p&gt;Will you like to know the challenges i went through try to do this for the first time? &lt;a href="https://dev.tourl"&gt;Click here&lt;/a&gt; and how I solved them.&lt;/p&gt;

</description>
      <category>virtualmachine</category>
      <category>azure</category>
      <category>cloud</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>How to Delete and Recover a Virtual Machine Using OS Disk</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Wed, 10 Sep 2025 22:18:57 +0000</pubDate>
      <link>https://dev.to/jic/how-to-delete-and-recover-a-virtual-machine-using-os-disk-3p2e</link>
      <guid>https://dev.to/jic/how-to-delete-and-recover-a-virtual-machine-using-os-disk-3p2e</guid>
      <description>&lt;p&gt;When you create a Virtual Machine (VM) in Azure, several resources are provisioned in the background—compute, networking, and storage. One of the most important of these is the OS Disk.&lt;/p&gt;

&lt;p&gt;What is an OS Disk in Azure?&lt;/p&gt;

&lt;p&gt;An OS Disk (Operating System Disk) is the virtual hard disk (VHD) that contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The operating system (Linux or Windows).&lt;/li&gt;
&lt;li&gt;Boot files needed to start the VM.&lt;/li&gt;
&lt;li&gt;Any system-level configurations or installed software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as the hard drive inside your computer—even if you remove the computer (the VM), the disk still has all your data. &lt;u&gt;_Note: Its should not be compared as a flash drive or external hard drive. _&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the OS Disk Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you deploy a VM, Azure attaches an OS disk (usually created from an image like Ubuntu, Windows Server, etc.).&lt;/p&gt;

&lt;p&gt;By default, the OS disk is C: for Windows or /dev/sda for Linux machines. The VM boots from this disk whenever you start it. Yes, the disk drive plays a vital role on the speed of VM.&lt;/p&gt;

&lt;p&gt;If you delete the VM (which I unknowingly did!!!) the Goodnews is that if the OS disk available, that VM can be recovered, you can later attach it to a new VM and recover everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;HOw Can you do so? &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's start with teaching you how to delete your VM safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Deleting the VM Safely&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you delete a VM to save costs or reconfigure it. But if you might want to restore it later, you need to** make sure the OS disk is preserved.**&lt;/p&gt;

&lt;p&gt;In Azure Portal, go to resource, click on the resource group, then select the virtual machine and click delete. You can also achieve the same thing by going to going to Virtual Machines directly.&lt;/p&gt;

&lt;p&gt;In the case below I would be recovering a deleted VM from the Test-RG. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jtdu92mm3o1t09yr977.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jtdu92mm3o1t09yr977.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the confirmation page, you’ll see resources like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmdyjx1gv1dd1th7s0q9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmdyjx1gv1dd1th7s0q9.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VM (Click on the VM file and delete just it. &lt;strong&gt;Uncheck the OS Disk so it doesn’t get deleted.&lt;/strong&gt; If required, you can force delete)&lt;/li&gt;
&lt;li&gt;Network Interface&lt;/li&gt;
&lt;li&gt;Public IP&lt;/li&gt;
&lt;li&gt;Network Security Group&lt;/li&gt;
&lt;li&gt;OS Disks
👉 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Step 2: Go back to Resource and Locate the OS Disk as in the picture below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb21wr3zhlbptfdf2muo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqb21wr3zhlbptfdf2muo.png" alt=" " width="800" height="724"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you still have it there while the VM is gone, you safe and have appropriately deleted the VM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: let's Recover the VM Using the OS Disk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open the OS disk resource. Click Create VM at the top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr70ppkju565mtwvwk73f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr70ppkju565mtwvwk73f.png" alt=" " width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Basics tab:&lt;/p&gt;

&lt;p&gt;Enter a VM name.&lt;/p&gt;

&lt;p&gt;Choose a subscription and resource group.&lt;/p&gt;

&lt;p&gt;Configure size, authentication (SSH key/password), and networking.&lt;/p&gt;

&lt;p&gt;Make sure the Image you are selecting the OS Disk of the previous VM created. Then you are on the right path of recovery. &lt;/p&gt;

&lt;p&gt;Then Click Review + Create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnjwxfbe10l4y5zxigve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnjwxfbe10l4y5zxigve.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Azure will deploy a new VM using the preserved OS disk.&lt;/p&gt;

&lt;p&gt;After the review, click on create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybqixwuhapike2fyzkxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybqixwuhapike2fyzkxc.png" alt=" " width="634" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔹 Step 4: Verify Recovery. Click on Go to Resource, then Go to Virtual Machines in the portal.&lt;/p&gt;

&lt;p&gt;Open the newly created VM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg49zwy94i19pfj742fig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg49zwy94i19pfj742fig.png" alt=" " width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect via SSH (Linux) or Download RDP (Windows).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6rp78xwyrio32r6a7zm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6rp78xwyrio32r6a7zm.png" alt=" " width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check Access, if it checks, you have done the right thing. Congratulations. 🎉 You can now proceed to deploy you VM.&lt;/p&gt;

&lt;p&gt;ENDNOTE: OS disk is the heart of your VM in Azure. By understanding how it works, you can confidently delete VMs when needed—knowing that as long as you keep the OS disk, you can always recover your VM later.&lt;/p&gt;

&lt;p&gt;This simple practice can save you from data loss, reinstallation hassles, and unexpected downtime.&lt;/p&gt;




</description>
      <category>virtualmachine</category>
      <category>azure</category>
      <category>cloudcomputing</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>How to Create a Linux Virtual Machine in Azure Portal</title>
      <dc:creator>JICDev</dc:creator>
      <pubDate>Sat, 06 Sep 2025 20:47:55 +0000</pubDate>
      <link>https://dev.to/jic/how-to-create-a-linux-virtual-machine-in-azure-portal-2482</link>
      <guid>https://dev.to/jic/how-to-create-a-linux-virtual-machine-in-azure-portal-2482</guid>
      <description>&lt;p&gt;Microsoft Azure makes it easy to deploy virtual machines (VMs) that run Linux. Whether you want to test an application, host a service, or learn Linux administration, setting up a VM in Azure is a great way to get started.&lt;/p&gt;

&lt;p&gt;This guide will walk you through &lt;strong&gt;creating a Linux VM on Azure Portal&lt;/strong&gt; step by step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Sign in to Azure Portal&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://portal.azure.com" rel="noopener noreferrer"&gt;https://portal.azure.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Log in with your Azure account credentials.&lt;/li&gt;
&lt;li&gt;You’ll land on the Azure &lt;strong&gt;Home dashboard&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There after your interface should look like the image below. Now you can click on Virtual Machine (VM). Mind you, you can also use the search bar for this purpose. &lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fels1r5sryie0ijzc4gkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fels1r5sryie0ijzc4gkl.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Click on Create&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ufiq1qf1farvuxlhmtn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ufiq1qf1farvuxlhmtn.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Configure Basics - This is where you fill in all the modalities of the virtual machine. You would select as below: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subscription&lt;/strong&gt; → Choose your subscription.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Group&lt;/strong&gt; → Select an existing one or click &lt;strong&gt;Create new&lt;/strong&gt; &lt;a href="https://dev.to/jic/azure-resource-groups-benefits-drawbacks-and-how-to-create-one-483m"&gt;Click here&lt;/a&gt; to learn how to do so. After creating your resource, then you select the resource you created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Virtual machine name&lt;/strong&gt; → Example: &lt;code&gt;TestMachine&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Region&lt;/strong&gt; → Choose the closest region to you or your users (e.g., East US, West Europe). NB: This can have an impact on the costing. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1js7dj4ppvzuxctvpf8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1js7dj4ppvzuxctvpf8f.png" alt=" " width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Availability options&lt;/strong&gt; → Leave as default for a simple setup. However, you choose zone if you what your Vm to be deployed to different zones. Mind you, the more the zones, the higher the pricing. For this test, kindly choose "No infrastructure redundancy required"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpburm4pbrmocidz0w5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhpburm4pbrmocidz0w5x.png" alt=" " width="793" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Select your image&lt;/em&gt;* Here you would see various operating system available. Since we are creating for a Linux VM we would use the Ubuntu Server 24.04 LTS as in the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshyi6d7v7qhcz8qh4dij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshyi6d7v7qhcz8qh4dij.png" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt; → Pick a VM size (e.g., Standard_B1s for testing "if you are using a free account" But if you are using a pay as you go account you can use any other that fits your needs".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 4: Administrator Account&lt;/p&gt;

&lt;p&gt;Set up the login details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication type&lt;/strong&gt; → Choose &lt;strong&gt;SSH public key&lt;/strong&gt; (recommended) or &lt;strong&gt;Password&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt; → Enter a Linux username (e.g., &lt;code&gt;Testuser1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSH public key source&lt;/strong&gt; →&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you already have a key, paste the &lt;strong&gt;public key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Or generate a new one inside the portal.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Step 5: Inbound Port Rules
&lt;/h2&gt;

&lt;p&gt;To connect via SSH, you need to allow port 22.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public inbound ports&lt;/strong&gt; → Select &lt;strong&gt;Allow selected ports&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select inbound ports&lt;/strong&gt; → Check &lt;strong&gt;SSH (22)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security Note:&lt;/strong&gt; For production, it’s better to allow SSH only from your IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔹 Step 7: Review + Create
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Azure will validate your configuration.&lt;/li&gt;
&lt;li&gt;If validation passes, click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11lujth7aoactm6uumtf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11lujth7aoactm6uumtf.png" alt=" " width="800" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deployment will take a few minutes.&lt;/p&gt;

&lt;p&gt;At this point you would be prompted to download the .pem file which would enable you to possible deploy the Linux VM (if you  used SSH as your login type) Download it for later as seen below: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf18bzp2xyb2msu7oet6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf18bzp2xyb2msu7oet6.png" alt=" " width="643" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It should like below: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febk74m61h8qg09sjtgtm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febk74m61h8qg09sjtgtm.png" alt=" " width="373" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔹 Step 8: Connect to Your Linux VM
&lt;/h2&gt;

&lt;p&gt;Once the VM is deployed: Clickk on "Go to resource" &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F818bayn0oja4vlxu4gim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F818bayn0oja4vlxu4gim.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;Virtual machines&lt;/strong&gt; in the left menu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Select your new VM&lt;/strong&gt; and click on Connect:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftja2ao9o0msxt042o6qt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftja2ao9o0msxt042o6qt.png" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the SSH command provided, e.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_rsa azureuser@&amp;lt;Public-IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53s6l1jxic9f58lw6rj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53s6l1jxic9f58lw6rj9.png" alt=" " width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the command from your &lt;strong&gt;Windows PowerShell&lt;/strong&gt; or a Linux terminal. So open you PowerShell if you use a windows computer like me. i.e see image below any one will do.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv8fujrby36d6gn66pkk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv8fujrby36d6gn66pkk.png" alt=" " width="790" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apply the following prompts: Note if you logged in using SSH: you need to navigate to the file.pem location to run the your VM. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb0ir2qqkc2jnl7u70p4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb0ir2qqkc2jnl7u70p4.png" alt=" " width="454" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once in, do the following paste the copied SSH command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_rsa azureuser@&amp;lt;Public-IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you did everything right!!! You will be required to authenticate, type in yes.  There you go!!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3e26s6ku6gqbxqn3fv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3e26s6ku6gqbxqn3fv6.png" alt=" " width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use the following command to confirm you are in the right VM i.e "pwd" "whoami"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkg5jetereoly7l5kupr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkg5jetereoly7l5kupr.png" alt=" " width="469" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now free to logout, by typing "Logout" command. &lt;/p&gt;

&lt;p&gt;If you are using a "pay as you go" Azure account, always remember to disconnect/stop the machine from running in the background to avoid being heavily charged. You can do so y going to your virtual machine and click stop or you delete entirely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr1itv0c68gfxtguqp2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr1itv0c68gfxtguqp2k.png" alt=" " width="800" height="508"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You’re now connected to your Linux VM! &lt;/p&gt;




&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Creating a Linux VM on Azure is straightforward: From here, you can start installing packages, hosting services, or experimenting with Linux commands.&lt;/p&gt;

&lt;p&gt;After this you can now decide to start installing packages, hosting services, add data disks &lt;a href="https://dev.tourl"&gt;(click here)&lt;/a&gt; or experimenting with Linux commands.&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>azure</category>
      <category>virtualmachine</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
