<?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: Izuabueke Davidson  Anujulu</title>
    <description>The latest articles on DEV Community by Izuabueke Davidson  Anujulu (@izuabueke).</description>
    <link>https://dev.to/izuabueke</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%2F2054015%2Fff0125d2-6b5d-4774-b960-efb67e05e801.png</url>
      <title>DEV Community: Izuabueke Davidson  Anujulu</title>
      <link>https://dev.to/izuabueke</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/izuabueke"/>
    <language>en</language>
    <item>
      <title>Node.js DevOps Pipeline – Docker, CI/CD, Kubernetes, Azure</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Tue, 16 Sep 2025 01:36:54 +0000</pubDate>
      <link>https://dev.to/izuabueke/nodejs-devops-pipeline-docker-cicd-kubernetes-azure-4742</link>
      <guid>https://dev.to/izuabueke/nodejs-devops-pipeline-docker-cicd-kubernetes-azure-4742</guid>
      <description>&lt;h1&gt;
  
  
  Table of Contents
&lt;/h1&gt;

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

&lt;li&gt;
 Prerequisites  &lt;/li&gt;

&lt;li&gt;
 Set Up Git for Version Control  &lt;/li&gt;

&lt;li&gt;
 Build the Node.js Web App  &lt;/li&gt;

&lt;li&gt;
 Testing Setup  &lt;/li&gt;

&lt;li&gt;
 CI/CD with GitHub Actions  &lt;/li&gt;

&lt;li&gt;
 Docker Configuration  &lt;/li&gt;

&lt;li&gt;
 Essential Configuration Files  &lt;/li&gt;

&lt;li&gt;
 Development with Docker Compose  &lt;/li&gt;

&lt;li&gt;
 Test Everything Locally  &lt;/li&gt;

&lt;li&gt;
 Docker Run  &lt;/li&gt;

&lt;li&gt;
 CI/CD with Deployment  &lt;/li&gt;

&lt;li&gt;
 Kubernetes Deployments  &lt;/li&gt;

&lt;li&gt;
 Complete Deployment Workflow  &lt;/li&gt;

&lt;li&gt;
 Hosted on Azure Web App  



&lt;ol&gt;
 App service plan  &lt;/ol&gt;

&lt;ol&gt;
 App Service  &lt;/ol&gt;

&lt;/li&gt;
 

&lt;/ul&gt;

&lt;p&gt;This project&lt;span id="intro"&gt; demonstrates a complete end-to-end DevOps workflow by building and deploying a modern &lt;strong&gt;Node.js web application&lt;/strong&gt;. It covers the full lifecycle of application development, from writing and testing code, to containerizing with &lt;strong&gt;Docker&lt;/strong&gt;, automating pipelines with &lt;strong&gt;GitHub Actions&lt;/strong&gt;, and deploying workloads to &lt;strong&gt;Kubernetes&lt;/strong&gt; environments for both staging and production.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;As part of this implementation, the application is also &lt;strong&gt;hosted on Azure Web App&lt;/strong&gt;, showcasing how cloud-native platforms can be leveraged for scalable and reliable application delivery. By combining local development with containerization and CI/CD automation, and extending deployments into Kubernetes clusters and Azure services, this project provides a practical demonstration of modern DevOps practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features of this project include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Building a Node.js application with testing (Jest, Supertest) and linting (ESLint).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Containerizing the app using Docker and orchestrating services with Docker Compose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automating builds, tests, and deployments with GitHub Actions CI/CD pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploying to Kubernetes clusters for staging and production environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hosting the application on Azure Web App to ensure scalability, availability, and cloud integration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project serves as a comprehensive learning resource for understanding how software development integrates with DevOps tools and cloud-native deployment strategies.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1.&lt;span id="pre"&gt; Prerequisites&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Install these tools before starting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js (v18 or higher)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download LTS (20.x as of 2025): &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify installation:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  node &lt;span class="nt"&gt;--version&lt;/span&gt;    &lt;span class="c"&gt;# Should show v18.x+ or v20.x+&lt;/span&gt;
  npm &lt;span class="nt"&gt;--version&lt;/span&gt;     &lt;span class="c"&gt;# Should show 9.x+ or 10.x+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;Git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify installation:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    git &lt;span class="nt"&gt;--version&lt;/span&gt;      &lt;span class="c"&gt;# Should show 2.34+ &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;Docker Desktop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify installation:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    docker &lt;span class="nt"&gt;--version&lt;/span&gt;          &lt;span class="c"&gt;# Should show 24.x+&lt;/span&gt;
    docker-compose &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub Account&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up at: &lt;a href="https://github.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Editor (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://code.visualstudio.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;recommended&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verify Everything is Installed&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;  node &lt;span class="nt"&gt;--version&lt;/span&gt;    &lt;span class="c"&gt;# Should show v18.x+ or v20.x+&lt;/span&gt;
  npm &lt;span class="nt"&gt;--version&lt;/span&gt;     &lt;span class="c"&gt;# Should show 9.x+ or 10.x+&lt;/span&gt;
  git &lt;span class="nt"&gt;--version&lt;/span&gt;     &lt;span class="c"&gt;# Should show 2.34+ &lt;/span&gt;
  docker &lt;span class="nt"&gt;--version&lt;/span&gt;  &lt;span class="c"&gt;# Should show 24.x+&lt;/span&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%2Fpihfwijjw4ijjk59spii.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%2Fpihfwijjw4ijjk59spii.png" alt="Verify Everything is Installed" width="800" height="248"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Set Up Git&lt;span id="git"&gt; for Version Control&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What this step does: Configures Git on your machine so it knows who you are when you make commits, and sets up proper project tracking.&lt;br&gt;
&lt;strong&gt;One-time Git Configuration&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;  git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
  git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"you@example.com"&lt;/span&gt;
  git config &lt;span class="nt"&gt;--global&lt;/span&gt; init.defaultBranch main
&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%2Ftmbxvr2nh4o2v4bxmki7.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%2Ftmbxvr2nh4o2v4bxmki7.png" alt="Git Configuration" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create and Initialize Project&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;  &lt;span class="nb"&gt;mkdir &lt;/span&gt;nodejs-devops-azure
  &lt;span class="nb"&gt;cd &lt;/span&gt;nodejs-devops-azure
  git init
&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%2Fvgohlofk0ayrf9whlo98.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%2Fvgohlofk0ayrf9whlo98.png" alt="Create and Initialize Project" width="800" height="170"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Build &lt;span id="Web"&gt;the Node.js Web App&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What this step does: Creates a web application using Node.js that can serve web pages and API endpoints&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialize Project&lt;/strong&gt;&lt;br&gt;
What this step does: Creates a package.json file that describes your project and manages dependencies.&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="c"&gt;# Create package.json with default settings&lt;/span&gt;
  npm init &lt;span class="nt"&gt;-y&lt;/span&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%2Fcizl3qf55yri2fj1usye.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%2Fcizl3qf55yri2fj1usye.png" alt="Create package.json with default settings" width="767" height="591"&gt;&lt;/a&gt;&lt;br&gt;
This creates a package.json. Update it as follows:&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="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"nodejs-devops-azure"&lt;/span&gt;,
        &lt;span class="s2"&gt;"version"&lt;/span&gt;: &lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;,
        &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"DevOps learning project with Node.js"&lt;/span&gt;,
        &lt;span class="s2"&gt;"main"&lt;/span&gt;: &lt;span class="s2"&gt;"app.js"&lt;/span&gt;,
        &lt;span class="s2"&gt;"scripts"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"start"&lt;/span&gt;: &lt;span class="s2"&gt;"node app.js"&lt;/span&gt;,
            &lt;span class="s2"&gt;"test"&lt;/span&gt;: &lt;span class="s2"&gt;"jest"&lt;/span&gt;,
            &lt;span class="s2"&gt;"dev"&lt;/span&gt;: &lt;span class="s2"&gt;"node app.js"&lt;/span&gt;,
            &lt;span class="s2"&gt;"lint"&lt;/span&gt;: &lt;span class="s2"&gt;"eslint ."&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"keywords"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"devops"&lt;/span&gt;, &lt;span class="s2"&gt;"nodejs"&lt;/span&gt;, &lt;span class="s2"&gt;"docker"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
        &lt;span class="s2"&gt;"author"&lt;/span&gt;: &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;,
        &lt;span class="s2"&gt;"license"&lt;/span&gt;: &lt;span class="s2"&gt;"MIT"&lt;/span&gt;,
        &lt;span class="s2"&gt;"engines"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"node"&lt;/span&gt;: &lt;span class="s2"&gt;"&amp;gt;=18.0.0"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"devDependencies"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"jest"&lt;/span&gt;: &lt;span class="s2"&gt;"^29.7.0"&lt;/span&gt;,
            &lt;span class="s2"&gt;"eslint"&lt;/span&gt;: &lt;span class="s2"&gt;"^8.57.0"&lt;/span&gt;,
            &lt;span class="s2"&gt;"supertest"&lt;/span&gt;: &lt;span class="s2"&gt;"^7.1.4"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;click on the package.json and replace the content with the code above. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5inc9k2d13nyav24jjod.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%2F5inc9k2d13nyav24jjod.png" alt="package.json" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Create Application File&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; &lt;span class="c"&gt;# Create the main application file&lt;/span&gt;
  &lt;span class="nb"&gt;touch &lt;/span&gt;app.js
&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%2Fwjj9twbayyuh6q13rdny.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%2Fwjj9twbayyuh6q13rdny.png" alt="main application file" width="800" height="214"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Copy the app.js code into this file&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;const http &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const url &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const port &lt;span class="o"&gt;=&lt;/span&gt; process.env.PORT &lt;span class="o"&gt;||&lt;/span&gt; 3000&lt;span class="p"&gt;;&lt;/span&gt;
const environment &lt;span class="o"&gt;=&lt;/span&gt; process.env.NODE_ENV &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'development'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;let &lt;/span&gt;requestCount &lt;span class="o"&gt;=&lt;/span&gt; 0&lt;span class="p"&gt;;&lt;/span&gt;
const startTime &lt;span class="o"&gt;=&lt;/span&gt; Date.now&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

// Enhanced Web Server
const server &lt;span class="o"&gt;=&lt;/span&gt; http.createServer&lt;span class="o"&gt;((&lt;/span&gt;req, res&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  requestCount++&lt;span class="p"&gt;;&lt;/span&gt;
  const timestamp &lt;span class="o"&gt;=&lt;/span&gt; new Date&lt;span class="o"&gt;()&lt;/span&gt;.toISOString&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  const &lt;span class="o"&gt;{&lt;/span&gt; pathname &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; url.parse&lt;span class="o"&gt;(&lt;/span&gt;req.url, &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; - &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.method&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pathname&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; - &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.headers[&lt;/span&gt;&lt;span class="s1"&gt;'user-agent'&lt;/span&gt;&lt;span class="p"&gt;] || &lt;/span&gt;&lt;span class="s1"&gt;'Unknown'&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  // CORS headers
  res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Origin'&lt;/span&gt;, &lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Methods'&lt;/span&gt;, &lt;span class="s1"&gt;'GET, POST, PUT, DELETE'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Access-Control-Allow-Headers'&lt;/span&gt;, &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  // Security headers
  res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'X-Content-Type-Options'&lt;/span&gt;, &lt;span class="s1"&gt;'nosniff'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'X-Frame-Options'&lt;/span&gt;, &lt;span class="s1"&gt;'DENY'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'X-XSS-Protection'&lt;/span&gt;, &lt;span class="s1"&gt;'1; mode=block'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  // Route handling
  switch &lt;span class="o"&gt;(&lt;/span&gt;pathname&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;:
      res.statusCode &lt;span class="o"&gt;=&lt;/span&gt; 200&lt;span class="p"&gt;;&lt;/span&gt;
      res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;, &lt;span class="s1"&gt;'text/html'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      res.end&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
        &amp;lt;&lt;span class="o"&gt;!&lt;/span&gt;DOCTYPE html&amp;gt;
        &amp;lt;html&amp;gt;
        &amp;lt;&lt;span class="nb"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &amp;lt;title&amp;gt;DevOps Lab 2025&amp;lt;/title&amp;gt;
          &amp;lt;style&amp;gt;
            body &lt;span class="o"&gt;{&lt;/span&gt; font-family: Arial, sans-serif&lt;span class="p"&gt;;&lt;/span&gt; max-width: 800px&lt;span class="p"&gt;;&lt;/span&gt; margin: 50px auto&lt;span class="p"&gt;;&lt;/span&gt; padding: 20px&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
            .header &lt;span class="o"&gt;{&lt;/span&gt; background: linear-gradient&lt;span class="o"&gt;(&lt;/span&gt;135deg, &lt;span class="c"&gt;#667eea 0%, #764ba2 100%); color: white; padding: 20px; border-radius: 8px; }&lt;/span&gt;
            .endpoint &lt;span class="o"&gt;{&lt;/span&gt; background: &lt;span class="c"&gt;#f8f9fa; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #007bff; }&lt;/span&gt;
          &amp;lt;/style&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
          &amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"header"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;h1&amp;gt; Node.js DevOps Pipeline – Docker, CI/CD, Kubernetes, Azure &amp;lt;/h1&amp;gt;
            &amp;lt;h2&amp;gt;Built by Izuabueke&amp;lt;/h2&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;p&amp;gt;This project demonstrates a &lt;span class="nb"&gt;complete &lt;/span&gt;end-to-end DevOps workflow by building and deploying a modern &lt;span class="k"&gt;**&lt;/span&gt;Node.js web application&lt;span class="k"&gt;**&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; It covers the full lifecycle of application development, from writing and testing code, to containerizing with &lt;span class="k"&gt;**&lt;/span&gt;Docker&lt;span class="k"&gt;**&lt;/span&gt;, automating pipelines with &lt;span class="k"&gt;**&lt;/span&gt;GitHub Actions&lt;span class="k"&gt;**&lt;/span&gt;, and deploying workloads to &lt;span class="k"&gt;**&lt;/span&gt;Kubernetes&lt;span class="k"&gt;**&lt;/span&gt; environments &lt;span class="k"&gt;for &lt;/span&gt;both staging and production.

As part of this implementation, the application is also &lt;span class="k"&gt;**&lt;/span&gt;hosted on Azure Web App&lt;span class="k"&gt;**&lt;/span&gt;, showcasing how cloud-native platforms can be leveraged &lt;span class="k"&gt;for &lt;/span&gt;scalable and reliable application delivery. By combining &lt;span class="nb"&gt;local &lt;/span&gt;development with containerization and CI/CD automation, and extending deployments into Kubernetes clusters and Azure services, this project provides a practical demonstration of modern DevOps practices.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&lt;span class="k"&gt;**&lt;/span&gt;Key features of this project include:&lt;span class="k"&gt;**&lt;/span&gt;

- Building a Node.js application with testing &lt;span class="o"&gt;(&lt;/span&gt;Jest, Supertest&lt;span class="o"&gt;)&lt;/span&gt; and linting &lt;span class="o"&gt;(&lt;/span&gt;ESLint&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

- Containerizing the app using Docker and orchestrating services with Docker Compose.

- Automating builds, tests, and deployments with GitHub Actions CI/CD pipelines.

- Deploying to Kubernetes clusters &lt;span class="k"&gt;for &lt;/span&gt;staging and production environments.

- Hosting the application on Azure Web App to ensure scalability, availability, and cloud integration.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;This project serves as a comprehensive learning resource &lt;span class="k"&gt;for &lt;/span&gt;understanding how software development integrates with DevOps tools and cloud-native deployment strategies.&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;My appreciation goes to my mentor &lt;span class="o"&gt;[&lt;/span&gt;Raphael Gab-Momoh&lt;span class="o"&gt;(&lt;/span&gt;MVP&lt;span class="o"&gt;)](&lt;/span&gt;https://www.linkedin.com/in/rgmh/&lt;span class="o"&gt;)[&lt;/span&gt;Olalekan OLADIRAN]&lt;span class="o"&gt;(&lt;/span&gt;https://www.linkedin.com/in/oladiranolalekan/&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;the &lt;span class="nb"&gt;time &lt;/span&gt;they’ve invested &lt;span class="k"&gt;in &lt;/span&gt;sharing their knowledge, providing clarity when things seemed complex, and pushing me to keep improving. Your support has made a real difference, and I’m grateful to have learned from such dedicated and inspiring coaches.&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;Thank you &lt;span class="k"&gt;for &lt;/span&gt;being part of this journey — I’m excited to keep building on what you’ve taught me.&amp;lt;/p&amp;gt;


          &amp;lt;h2&amp;gt;Available Endpoints:&amp;lt;/h2&amp;gt;
          &amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"endpoint"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;strong&amp;gt;GET /&amp;lt;/strong&amp;gt; - This welcome page
          &amp;lt;/div&amp;gt;
          &amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"endpoint"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;strong&amp;gt;GET /health&amp;lt;/strong&amp;gt; - Health check &lt;span class="o"&gt;(&lt;/span&gt;JSON&lt;span class="o"&gt;)&lt;/span&gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"endpoint"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;strong&amp;gt;GET /info&amp;lt;/strong&amp;gt; - System information
          &amp;lt;/div&amp;gt;
          &amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"endpoint"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &amp;lt;strong&amp;gt;GET /metrics&amp;lt;/strong&amp;gt; - Prometheus metrics
          &amp;lt;/div&amp;gt;
          &amp;lt;p&amp;gt;Environment: &amp;lt;strong&amp;gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
          &amp;lt;p&amp;gt;Server &lt;span class="nb"&gt;time&lt;/span&gt;: &amp;lt;strong&amp;gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
          &amp;lt;p&amp;gt;Requests served: &amp;lt;strong&amp;gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;requestCount&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;/body&amp;gt;
        &amp;lt;/html&amp;gt;
      &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'/health'&lt;/span&gt;:
      res.statusCode &lt;span class="o"&gt;=&lt;/span&gt; 200&lt;span class="p"&gt;;&lt;/span&gt;
      res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;, &lt;span class="s1"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      res.end&lt;span class="o"&gt;(&lt;/span&gt;JSON.stringify&lt;span class="o"&gt;({&lt;/span&gt;
        status: &lt;span class="s1"&gt;'healthy'&lt;/span&gt;,
        timestamp: new Date&lt;span class="o"&gt;()&lt;/span&gt;.toISOString&lt;span class="o"&gt;()&lt;/span&gt;,
        &lt;span class="nb"&gt;uptime&lt;/span&gt;: process.uptime&lt;span class="o"&gt;()&lt;/span&gt;,
        environment: environment,
        version: &lt;span class="s1"&gt;'1.0.0'&lt;/span&gt;,
        node_version: process.version,
        requests_served: requestCount
      &lt;span class="o"&gt;}&lt;/span&gt;, null, 2&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'/info'&lt;/span&gt;:
      res.statusCode &lt;span class="o"&gt;=&lt;/span&gt; 200&lt;span class="p"&gt;;&lt;/span&gt;
      res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;, &lt;span class="s1"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      res.end&lt;span class="o"&gt;(&lt;/span&gt;JSON.stringify&lt;span class="o"&gt;({&lt;/span&gt;
        platform: process.platform,
        architecture: process.arch,
        node_version: process.version,
        memory_usage: process.memoryUsage&lt;span class="o"&gt;()&lt;/span&gt;,
        environment: environment,
        pid: process.pid,
        &lt;span class="nb"&gt;uptime&lt;/span&gt;: process.uptime&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;, null, 2&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'/metrics'&lt;/span&gt;:
      res.statusCode &lt;span class="o"&gt;=&lt;/span&gt; 200&lt;span class="p"&gt;;&lt;/span&gt;
      res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;, &lt;span class="s1"&gt;'text/plain'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      res.end&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="c"&gt;# HELP http_requests_total Total HTTP requests&lt;/span&gt;
&lt;span class="c"&gt;# TYPE http_requests_total counter&lt;/span&gt;
http_requests_total &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;requestCount&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# HELP app_uptime_seconds Application uptime in seconds&lt;/span&gt;
&lt;span class="c"&gt;# TYPE app_uptime_seconds gauge&lt;/span&gt;
app_uptime_seconds &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.uptime()&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# HELP nodejs_memory_usage_bytes Node.js memory usage&lt;/span&gt;
&lt;span class="c"&gt;# TYPE nodejs_memory_usage_bytes gauge&lt;/span&gt;
nodejs_memory_usage_bytes&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"rss"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.memoryUsage().rss&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
nodejs_memory_usage_bytes&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"heapUsed"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.memoryUsage().heapUsed&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
nodejs_memory_usage_bytes&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"heapTotal"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.memoryUsage().heapTotal&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
nodejs_memory_usage_bytes&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"external"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.memoryUsage().external&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    default:
      res.statusCode &lt;span class="o"&gt;=&lt;/span&gt; 404&lt;span class="p"&gt;;&lt;/span&gt;
      res.setHeader&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;, &lt;span class="s1"&gt;'application/json'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      res.end&lt;span class="o"&gt;(&lt;/span&gt;JSON.stringify&lt;span class="o"&gt;({&lt;/span&gt;
        error: &lt;span class="s1"&gt;'Not Found'&lt;/span&gt;,
        message: &lt;span class="sb"&gt;`&lt;/span&gt;Route &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pathname&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; not found&lt;span class="sb"&gt;`&lt;/span&gt;,
        timestamp: new Date&lt;span class="o"&gt;()&lt;/span&gt;.toISOString&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;, null, 2&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

// Graceful shutdown
process.on&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SIGTERM'&lt;/span&gt;, &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Received SIGTERM, shutting down gracefully'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  server.close&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Server closed'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    process.exit&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

process.on&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SIGINT'&lt;/span&gt;, &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Received SIGINT, shutting down gracefully'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  server.close&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Server closed'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    process.exit&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

// Start server
server.listen&lt;span class="o"&gt;(&lt;/span&gt;port, &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;🚀 Server running at http://localhost:&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Environment: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Node.js version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

// Export server &lt;span class="k"&gt;for &lt;/span&gt;testing
module.exports &lt;span class="o"&gt;=&lt;/span&gt; server&lt;span class="p"&gt;;&lt;/span&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%2F92e9gcywbq94k77gf7x1.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%2F92e9gcywbq94k77gf7x1.png" alt="Copy the app.js code into this file" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Dependencies&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;  &lt;span class="c"&gt;# Install testing and development tools&lt;/span&gt;
  npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; jest eslint supertest

  &lt;span class="c"&gt;# Install all dependencies (creates node_modules folder)&lt;/span&gt;
  npm &lt;span class="nb"&gt;install&lt;/span&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%2Fdf4n52p4fnkylrr5y0p3.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%2Fdf4n52p4fnkylrr5y0p3.png" alt="Install Dependencies" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Testing&lt;span id="Setup"&gt; Setup&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create Test Folder and File&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;  &lt;span class="c"&gt;# Create a folder for your tests&lt;/span&gt;
  &lt;span class="nb"&gt;mkdir &lt;/span&gt;tests
  &lt;span class="c"&gt;# Create the main test file&lt;/span&gt;
  &lt;span class="nb"&gt;touch &lt;/span&gt;tests/app.test.js
&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%2Ff3wiq1ox8kdaxldph5fk.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%2Ff3wiq1ox8kdaxldph5fk.png" alt="Create Test Folder and File" width="742" height="284"&gt;&lt;/a&gt;&lt;br&gt;
Copy the test code into this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;const request &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'supertest'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
const server &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../app'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

describe&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'App Endpoints'&lt;/span&gt;, &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  afterAll&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    server.close&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET / should return welcome page'&lt;/span&gt;, async &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const response &lt;span class="o"&gt;=&lt;/span&gt; await request&lt;span class="o"&gt;(&lt;/span&gt;server&lt;span class="o"&gt;)&lt;/span&gt;.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.status&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.text&lt;span class="o"&gt;)&lt;/span&gt;.toContain&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DevOps Lab 2025'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET /health should return health status'&lt;/span&gt;, async &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const response &lt;span class="o"&gt;=&lt;/span&gt; await request&lt;span class="o"&gt;(&lt;/span&gt;server&lt;span class="o"&gt;)&lt;/span&gt;.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/health'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.status&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.body.status&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'healthy'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.body.timestamp&lt;span class="o"&gt;)&lt;/span&gt;.toBeDefined&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;typeof response.body.uptime&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'number'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET /info should return system info'&lt;/span&gt;, async &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const response &lt;span class="o"&gt;=&lt;/span&gt; await request&lt;span class="o"&gt;(&lt;/span&gt;server&lt;span class="o"&gt;)&lt;/span&gt;.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/info'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.status&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.body.platform&lt;span class="o"&gt;)&lt;/span&gt;.toBeDefined&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.body.node_version&lt;span class="o"&gt;)&lt;/span&gt;.toBeDefined&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET /metrics should return prometheus metrics'&lt;/span&gt;, async &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const response &lt;span class="o"&gt;=&lt;/span&gt; await request&lt;span class="o"&gt;(&lt;/span&gt;server&lt;span class="o"&gt;)&lt;/span&gt;.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/metrics'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.status&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.text&lt;span class="o"&gt;)&lt;/span&gt;.toContain&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http_requests_total'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.text&lt;span class="o"&gt;)&lt;/span&gt;.toContain&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app_uptime_seconds'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'GET /nonexistent should return 404'&lt;/span&gt;, async &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const response &lt;span class="o"&gt;=&lt;/span&gt; await request&lt;span class="o"&gt;(&lt;/span&gt;server&lt;span class="o"&gt;)&lt;/span&gt;.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/nonexistent'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.status&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;404&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    expect&lt;span class="o"&gt;(&lt;/span&gt;response.body.error&lt;span class="o"&gt;)&lt;/span&gt;.toBe&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Not Found'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create Jest Config&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="c"&gt;# Create Jest configuration file&lt;/span&gt;
  &lt;span class="nb"&gt;touch &lt;/span&gt;jest.config.js
&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%2Femikfp417x6za90wgfn2.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%2Femikfp417x6za90wgfn2.png" alt="Create Jest Config" width="762" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the Jest Config code into this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  module.exports &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  testEnvironment: &lt;span class="s1"&gt;'node'&lt;/span&gt;,
  collectCoverage: &lt;span class="nb"&gt;true&lt;/span&gt;,
  coverageDirectory: &lt;span class="s1"&gt;'coverage'&lt;/span&gt;,
  testMatch: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'**/tests/**/*.test.js'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
  verbose: &lt;span class="nb"&gt;true&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&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%2Frp6dt418ykt3wy7p72ms.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%2Frp6dt418ykt3wy7p72ms.png" alt="Copy the Jest Config code" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. CI/CD with GitHub&lt;span id="CI/CD"&gt; Actions&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create workflow folder and file:&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;  &lt;span class="c"&gt;# Create the GitHub Actions directory structure&lt;/span&gt;
  &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .github/workflows
  &lt;span class="c"&gt;# Create the workflow file&lt;/span&gt;
  &lt;span class="nb"&gt;touch&lt;/span&gt; .github/workflows/ci.yml
&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%2F0xol3jvshepsb77z5fyw.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%2F0xol3jvshepsb77z5fyw.png" alt="Create workflow folder and file" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the pipeline code into this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;name: CI/CD Pipeline

on:
  push:
    branches: &lt;span class="o"&gt;[&lt;/span&gt; main, develop &lt;span class="o"&gt;]&lt;/span&gt;
  pull_request:
    branches: &lt;span class="o"&gt;[&lt;/span&gt; main &lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="nb"&gt;env&lt;/span&gt;:
  NODE_VERSION: &lt;span class="s1"&gt;'20'&lt;/span&gt;
  REGISTRY: ghcr.io
  IMAGE_NAME: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ github.repository &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;jobs&lt;/span&gt;:
  &lt;span class="nb"&gt;test&lt;/span&gt;:
    name: Run Tests
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;18, 20]

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
        uses: actions/setup-node@v4
        with:
          node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
          cache: &lt;span class="s1"&gt;'npm'&lt;/span&gt;

      - name: Install dependencies
        run: npm ci

      - name: Run linting
        run: npx eslint &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--ext&lt;/span&gt; .js &lt;span class="nt"&gt;--ignore-pattern&lt;/span&gt; node_modules/
        &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="nt"&gt;-on-error&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;

      - name: Run tests
        run: npm &lt;span class="nb"&gt;test&lt;/span&gt;

      - name: Run security audit
        run: npm audit &lt;span class="nt"&gt;--audit-level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;moderate &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true

  &lt;/span&gt;build:
    name: Build Docker Image
    runs-on: ubuntu-latest
    needs: &lt;span class="nb"&gt;test
    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;: github.event_name &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'push'&lt;/span&gt;

    permissions:
      contents: &lt;span class="nb"&gt;read
      &lt;/span&gt;packages: write

    outputs:
      image-digest: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ steps.build.outputs.digest &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      image-tag: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ steps.meta.outputs.tags &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log &lt;span class="k"&gt;in &lt;/span&gt;to Container Registry
        uses: docker/login-action@v3
        with:
          registry: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ env.REGISTRY &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
          username: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ github.actor &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
          password: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ secrets.GITHUB_TOKEN &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

      - name: Extract metadata
        &lt;span class="nb"&gt;id&lt;/span&gt;: meta
        uses: docker/metadata-action@v5
        with:
          images: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ env.REGISTRY &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ env.IMAGE_NAME &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
          tags: |
            &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ref,event&lt;span class="o"&gt;=&lt;/span&gt;branch
            &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sha,prefix&lt;span class="o"&gt;={{&lt;/span&gt;branch&lt;span class="o"&gt;}}&lt;/span&gt;-
            &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;raw,value&lt;span class="o"&gt;=&lt;/span&gt;latest,enable&lt;span class="o"&gt;={{&lt;/span&gt;is_default_branch&lt;span class="o"&gt;}}&lt;/span&gt;

      - name: Build and push Docker image
        &lt;span class="nb"&gt;id&lt;/span&gt;: build
        uses: docker/build-push-action@v5
        with:
          context: &lt;span class="nb"&gt;.&lt;/span&gt;
          platforms: linux/amd64,linux/arm64
          push: &lt;span class="nb"&gt;true
          &lt;/span&gt;tags: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ steps.meta.outputs.tags &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
          labels: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ steps.meta.outputs.labels &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
          cache-from: &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gha
          cache-to: &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gha,mode&lt;span class="o"&gt;=&lt;/span&gt;max

  deploy-staging:
    name: Deploy to Staging
    runs-on: ubuntu-latest
    needs: build
    &lt;span class="k"&gt;if&lt;/span&gt;: github.ref &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'refs/heads/develop'&lt;/span&gt;
    environment: staging

    steps:
      - name: Deploy to staging
        run: |
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🚀 Deploying to staging environment..."&lt;/span&gt;
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Image: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ needs.build.outputs.image-tag &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Would deploy to staging server here"&lt;/span&gt;
          &lt;span class="c"&gt;# In real scenario, you'd use:&lt;/span&gt;
          &lt;span class="c"&gt;# - kubectl apply -f k8s/staging/&lt;/span&gt;
          &lt;span class="c"&gt;# - docker-compose -f docker-compose.staging.yml up -d&lt;/span&gt;
          &lt;span class="c"&gt;# - ssh staging-server "docker pull $IMAGE &amp;amp;&amp;amp; docker-compose up -d"&lt;/span&gt;

  deploy-production:
    name: Deploy to Production
    runs-on: ubuntu-latest
    needs: build
    &lt;span class="k"&gt;if&lt;/span&gt;: github.ref &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'refs/heads/main'&lt;/span&gt;
    environment: production

    steps:
      - name: Deploy to production
        run: |
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🎯 Deploying to production environment..."&lt;/span&gt;
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Image: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ needs.build.outputs.image-tag &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Image digest: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ needs.build.outputs.image-digest &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Would deploy to production server here"&lt;/span&gt;
          &lt;span class="c"&gt;# In real scenario, you'd use:&lt;/span&gt;
          &lt;span class="c"&gt;# - kubectl apply -f k8s/production/&lt;/span&gt;
          &lt;span class="c"&gt;# - terraform apply&lt;/span&gt;
          &lt;span class="c"&gt;# - ansible-playbook deploy.yml&lt;/span&gt;

  security-scan:
    name: Security Scan
    runs-on: ubuntu-latest
    needs: build
    &lt;span class="k"&gt;if&lt;/span&gt;: github.event_name &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'push'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; github.ref &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'refs/heads/main'&lt;/span&gt;

    steps:
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: &lt;span class="s1"&gt;'ghcr.io/anujulu/my-devops-project:latest'&lt;/span&gt;  &lt;span class="c"&gt;# Note lowercase&lt;/span&gt;
          format: &lt;span class="s1"&gt;'sarif'&lt;/span&gt;
          output: &lt;span class="s1"&gt;'trivy-results.sarif'&lt;/span&gt;
    &lt;span class="nb"&gt;env&lt;/span&gt;:
      TRIVY_USERNAME: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ github.actor &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      TRIVY_PASSWORD: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ secrets.GITHUB_TOKEN &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&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%2F1avru29jcnv9qf4cfbmu.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%2F1avru29jcnv9qf4cfbmu.png" alt="Copy the pipeline code into this file" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;6. Docker&lt;span id="Docker"&gt; Configuration&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create Dockerfile&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;
  &lt;span class="c"&gt;# Create the Dockerfile (no extension needed)&lt;/span&gt;
  &lt;span class="nb"&gt;touch &lt;/span&gt;Dockerfile
&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%2Fcsb7u2ofbozqmmdcm5w6.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%2Fcsb7u2ofbozqmmdcm5w6.png" alt="Create Dockerfile" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the Dockerfile code into this file.&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="c"&gt;# Fixed and Verified Multi-stage build for optimized image&lt;/span&gt;
FROM node:20-alpine AS dependencies

&lt;span class="c"&gt;# Update packages for security (Alpine 3.19+ automatically)&lt;/span&gt;
RUN apk update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk upgrade &lt;span class="nt"&gt;--no-cache&lt;/span&gt;

WORKDIR /app

&lt;span class="c"&gt;# Copy package files first for better caching&lt;/span&gt;
COPY package&lt;span class="k"&gt;*&lt;/span&gt;.json ./

&lt;span class="c"&gt;# Install only production dependencies&lt;/span&gt;
RUN npm ci &lt;span class="nt"&gt;--only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm cache clean &lt;span class="nt"&gt;--force&lt;/span&gt;

&lt;span class="c"&gt;# Production stage  &lt;/span&gt;
FROM node:20-alpine AS production

&lt;span class="c"&gt;# Update packages and install necessary tools&lt;/span&gt;
RUN apk update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk upgrade &lt;span class="nt"&gt;--no-cache&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; curl dumb-init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/cache/apk/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Create non-root user with proper permissions&lt;/span&gt;
RUN addgroup &lt;span class="nt"&gt;-g&lt;/span&gt; 1001 &lt;span class="nt"&gt;-S&lt;/span&gt; nodejs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    adduser &lt;span class="nt"&gt;-S&lt;/span&gt; nodeuser &lt;span class="nt"&gt;-u&lt;/span&gt; 1001 &lt;span class="nt"&gt;-G&lt;/span&gt; nodejs

WORKDIR /app

&lt;span class="c"&gt;# Copy dependencies from previous stage with proper ownership&lt;/span&gt;
COPY &lt;span class="nt"&gt;--from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dependencies &lt;span class="nt"&gt;--chown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nodeuser:nodejs /app/node_modules ./node_modules

&lt;span class="c"&gt;# Copy application code with proper ownership&lt;/span&gt;
COPY &lt;span class="nt"&gt;--chown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nodeuser:nodejs package&lt;span class="k"&gt;*&lt;/span&gt;.json ./
COPY &lt;span class="nt"&gt;--chown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nodeuser:nodejs app.js ./

&lt;span class="c"&gt;# Switch to non-root user&lt;/span&gt;
USER nodeuser

&lt;span class="c"&gt;# Expose port&lt;/span&gt;
EXPOSE 3000

&lt;span class="c"&gt;# Health check with proper timing for Node.js startup&lt;/span&gt;
HEALTHCHECK &lt;span class="nt"&gt;--interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="nt"&gt;--timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10s &lt;span class="nt"&gt;--start-period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;15s &lt;span class="nt"&gt;--retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 &lt;span class="se"&gt;\&lt;/span&gt;
  CMD curl &lt;span class="nt"&gt;-f&lt;/span&gt; http://localhost:3000/health &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1

&lt;span class="c"&gt;# Use dumb-init for proper signal handling in containers&lt;/span&gt;
ENTRYPOINT &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dumb-init"&lt;/span&gt;, &lt;span class="s2"&gt;"--"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Start application&lt;/span&gt;
CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;, &lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&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%2Fnvkvn9awih7tcu4mtgqu.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%2Fnvkvn9awih7tcu4mtgqu.png" alt="Copy the Dockerfile code into this file" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 7: Essential&lt;span id="Essential"&gt; Configuration Files&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What this step does: Creates configuration files that tell various tools what to ignore, how to behave, and what settings to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create .dockerignore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What this file does: Tells Docker which files to ignore when building the container image (similar to .gitignore).&lt;/p&gt;

&lt;p&gt;How to create the file:&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="c"&gt;# Create Docker ignore file&lt;/span&gt;
  &lt;span class="nb"&gt;touch&lt;/span&gt; .dockerignore 
&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%2Fzbffuv9bg2y5nq8xcc9j.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%2Fzbffuv9bg2y5nq8xcc9j.png" alt="Create Docker ignore file" width="721" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy this content into .dockerignore&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node_modules 
npm-debug
.log&lt;span class="k"&gt;*&lt;/span&gt; 
.git 
.github 
.env 
.env.local 
.env.&lt;span class="k"&gt;*&lt;/span&gt;.local 
logs 
&lt;span class="k"&gt;*&lt;/span&gt;.log 
coverage 
.nyc_output 
.vscode 
.idea 
&lt;span class="k"&gt;*&lt;/span&gt;.swp 
&lt;span class="k"&gt;*&lt;/span&gt;.swo 
.DS_Store 
Thumbs.db 
README.md 
tests/ 
jest.config.js 
.eslintrc&lt;span class="k"&gt;*&lt;/span&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%2Fwz7ftefhr9hstbcupcow.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%2Fwz7ftefhr9hstbcupcow.png" alt=" " width="800" height="556"&gt;&lt;/a&gt;&lt;br&gt;
(coverage .nyc_output .vscode .idea *.swp .swo .DS_Store Thumbs.db README.md tests/ jest.config.js .eslintrc)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create .gitignore&lt;/strong&gt; &lt;br&gt;
What this file does: Tells Git which files to ignore and not track in version control (like temporary files, dependencies, etc.).&lt;/p&gt;

&lt;p&gt;How to create the file:&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;touch&lt;/span&gt; .gitignore  
&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%2Fgl20iyysmdtvsi48n9rx.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%2Fgl20iyysmdtvsi48n9rx.png" alt="Create .gitignore" width="716" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy this content into .gitignore&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="c"&gt;# Dependencies&lt;/span&gt;
node_modules/
npm-debug.log&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Runtime data&lt;/span&gt;
pids
&lt;span class="k"&gt;*&lt;/span&gt;.pid
&lt;span class="k"&gt;*&lt;/span&gt;.seed
&lt;span class="k"&gt;*&lt;/span&gt;.pid.lock

&lt;span class="c"&gt;# Coverage&lt;/span&gt;
coverage/
.nyc_output

&lt;span class="c"&gt;# Environment variables&lt;/span&gt;
.env
.env.local
.env.&lt;span class="k"&gt;*&lt;/span&gt;.local

&lt;span class="c"&gt;# Logs&lt;/span&gt;
logs
&lt;span class="k"&gt;*&lt;/span&gt;.log

&lt;span class="c"&gt;# IDE&lt;/span&gt;
.vscode/
.idea/
&lt;span class="k"&gt;*&lt;/span&gt;.swp
&lt;span class="k"&gt;*&lt;/span&gt;.swo

&lt;span class="c"&gt;# OS&lt;/span&gt;
.DS_Store
Thumbs.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Dependencies node_modules/ npm-debug.log* *.pid .seed .pid.lock coverage/ .nyc_output .env .env.local .env..local logs *.log .vscode/ .idea/ *.swp *.swo .DS_Store Thumbs.db)&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%2Faw5g0y0jp9k809vt5jit.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%2Faw5g0y0jp9k809vt5jit.png" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create environment template&lt;/strong&gt;&lt;br&gt;
What this file does: Shows other developers what environment variables your application needs, without exposing actual secrets.&lt;/p&gt;

&lt;p&gt;How to create the file:&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="c"&gt;# Create environment template file&lt;/span&gt;
  &lt;span class="nb"&gt;touch&lt;/span&gt; .env.example  
&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%2Frtcn5x9xjviwp385sy23.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%2Frtcn5x9xjviwp385sy23.png" alt="Create environment template file" width="739" height="217"&gt;&lt;/a&gt;&lt;br&gt;
Copy this content into .env.example&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="c"&gt;# Server Configuration &lt;/span&gt;
&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3000 
&lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production  
&lt;span class="c"&gt;# Logging &lt;/span&gt;
&lt;span class="nv"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info
&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%2Ff5pcdup9bzo2k9bttyy3.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%2Ff5pcdup9bzo2k9bttyy3.png" alt="Copy this content into .env.example" width="800" height="488"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Create ESLint configuration&lt;/strong&gt;&lt;br&gt;
What this file does: Configures ESLint to check your JavaScript code for errors and maintain consistent coding style.&lt;/p&gt;

&lt;p&gt;How to create the file:&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="c"&gt;# Create ESLint configuration file&lt;/span&gt;
  &lt;span class="nb"&gt;touch&lt;/span&gt; .eslintrc.js  
&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%2Ffirph9nczqucug5qmxxr.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%2Ffirph9nczqucug5qmxxr.png" alt="Create ESLint configuration file" width="800" height="201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module.exports &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;env&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    node: &lt;span class="nb"&gt;true&lt;/span&gt;,
    es2021: &lt;span class="nb"&gt;true&lt;/span&gt;,
    jest: &lt;span class="nb"&gt;true&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  extends: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'eslint:recommended'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
  parserOptions: &lt;span class="o"&gt;{&lt;/span&gt;
    ecmaVersion: 12,
    sourceType: &lt;span class="s1"&gt;'module'&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  rules: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'no-console'&lt;/span&gt;: &lt;span class="s1"&gt;'off'&lt;/span&gt;,
    &lt;span class="s1"&gt;'no-unused-vars'&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'argsIgnorePattern'&lt;/span&gt;: &lt;span class="s1"&gt;'^_'&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&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%2Fsvmb45lz4rdlugdnzrt3.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%2Fsvmb45lz4rdlugdnzrt3.png" alt="Create ESLint configuration" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;8. Development with Docker&lt;span id="Compose"&gt; Compose&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What this step does: Creates a Docker Compose file that makes it easy to run your application and any supporting services (like databases) with a single command.&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="c"&gt;# Create Docker Compose configuration file&lt;/span&gt;
  &lt;span class="nb"&gt;touch &lt;/span&gt;docker-compose.yml
&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%2Fb222m99eu134kpyj5hcv.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%2Fb222m99eu134kpyj5hcv.png" alt="Create Docker Compose configuration file" width="745" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the docker-compose.yml code into this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;version: &lt;span class="s1"&gt;'3.8'&lt;/span&gt;

services:
  app:
    build: &lt;span class="nb"&gt;.&lt;/span&gt;
    ports:
      - &lt;span class="s2"&gt;"3000:3000"&lt;/span&gt;
    environment:
      - &lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development
      - &lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3000
    restart: unless-stopped
    healthcheck:
      &lt;span class="nb"&gt;test&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CMD"&lt;/span&gt;, &lt;span class="s2"&gt;"curl"&lt;/span&gt;, &lt;span class="s2"&gt;"-f"&lt;/span&gt;, &lt;span class="s2"&gt;"http://localhost:3000/health"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      interval: 30s
      &lt;span class="nb"&gt;timeout&lt;/span&gt;: 10s
      retries: 3
      start_period: 10s
&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%2Fajygip0jour2x8h01714.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%2Fajygip0jour2x8h01714.png" alt="Create Docker Compose configuration file" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;9. Test Everything&lt;span id="Every"&gt; Locally&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Local 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="c"&gt;# Install all dependencies from package.json (including latest versions)&lt;/span&gt;
  npm &lt;span class="nb"&gt;install&lt;/span&gt;
  &lt;span class="c"&gt;# Run your test suite to make sure everything works&lt;/span&gt;
  npm &lt;span class="nb"&gt;test&lt;/span&gt;
  &lt;span class="c"&gt;# Start the application server&lt;/span&gt;
  npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What you'll see:&lt;/p&gt;

&lt;p&gt;Tests should pass with green checkmarks: ✓ GET / should return &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%2F5hvsg3fplq5bhjn5977o.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%2F5hvsg3fplq5bhjn5977o.png" alt="Test Everything Locally" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;welcome page&lt;br&gt;
Server starts and shows: 🚀 Server running at &lt;a href="http://localhost:3000/" rel="noopener noreferrer"&gt;http://localhost:3000/&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%2F6bquklf8ynjio1awl0dh.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%2F6bquklf8ynjio1awl0dh.png" alt="welcome page" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Test endpoints:&lt;/strong&gt;
&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;# In a new terminal window, test the endpoints:&lt;/span&gt;
  curl http://localhost:3000/         &lt;span class="c"&gt;# Homepage&lt;/span&gt;
  curl http://localhost:3000/health   &lt;span class="c"&gt;# Health check JSON&lt;/span&gt;
  curl http://localhost:3000/info     &lt;span class="c"&gt;# System info JSON&lt;/span&gt;
  curl http://localhost:3000/metrics  &lt;span class="c"&gt;# Prometheus metrics&lt;/span&gt;

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;10.Docker &lt;span id="Run"&gt; Commands&lt;/span&gt;&lt;/strong&gt;
&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;# Build image&lt;/span&gt;
  docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nodejs-devops-azure:latest &lt;span class="nb"&gt;.&lt;/span&gt;
  &lt;span class="c"&gt;# Run container&lt;/span&gt;
  docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;--name&lt;/span&gt; my-devops-container nodejs-devops-azure:latest
  &lt;span class="c"&gt;# Check container status&lt;/span&gt;
  docker ps

  &lt;span class="c"&gt;# Test health check&lt;/span&gt;
  curl http://localhost:3000/health

  &lt;span class="c"&gt;# Stop container&lt;/span&gt;
  docker stop my-devops-container
  docker &lt;span class="nb"&gt;rm &lt;/span&gt;my-devops-container
&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%2Fouve7adokl42jatmqfhc.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%2Fouve7adokl42jatmqfhc.png" alt="Build image" width="800" height="495"&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%2Fylnbpppjpl6mlotj9hr7.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%2Fylnbpppjpl6mlotj9hr7.png" alt="Stop container" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Docker Compose Run&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What these commands do: Use Docker Compose to manage multiple services together with a single command.&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="c"&gt;# Start all services defined in docker-compose.yml&lt;/span&gt;
  docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
  &lt;span class="c"&gt;# View real-time logs from all services&lt;/span&gt;
  docker-compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;
  &lt;span class="c"&gt;# Stop all services and clean up&lt;/span&gt;
  docker-compose down
&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%2Ft2gfkzhrk0k1r9c499h5.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%2Ft2gfkzhrk0k1r9c499h5.png" alt="Start all services defined in docker-compose.yml" width="800" height="362"&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%2Fhglwateemo0niy0nr18r.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%2Fhglwateemo0niy0nr18r.png" alt="View real-time logs from all services" width="800" height="351"&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%2Fhj5gmzmzq3jj0ix9xgi4.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%2Fhj5gmzmzq3jj0ix9xgi4.png" alt="Stop all services and clean up" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;11. CI/CD with &lt;span id="with"&gt; Deployment&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Initial commit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What this does: Takes a snapshot of all your files and saves it in Git history.&lt;/p&gt;

&lt;p&gt;How to commit your code:&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="c"&gt;# Add all files to Git staging area&lt;/span&gt;
  git add &lt;span class="nb"&gt;.&lt;/span&gt;

  &lt;span class="c"&gt;# Create your first commit with a descriptive message&lt;/span&gt;
  git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit: Complete DevOps setup with working CI/CD"&lt;/span&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%2F9xwn2bmxzekowbw55g0e.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%2F9xwn2bmxzekowbw55g0e.png" alt="Create your first commit with a descriptive message" width="800" height="663"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What this step does: Links your local Git repository to a remote GitHub repository and uploads your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to connect and push:&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;  &lt;span class="c"&gt;# Set main as the default branch&lt;/span&gt;
  git branch &lt;span class="nt"&gt;-M&lt;/span&gt; main

  &lt;span class="c"&gt;# Connect to your GitHub repository (replace yourusername with your actual GitHub username)&lt;/span&gt;
  git remote add origin https://github.com/yourusername/my-devops-project.git

  &lt;span class="c"&gt;# Push your code to GitHub for the first time&lt;/span&gt;
  git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main

&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%2Fctumjg3vexrloq2rtkkl.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%2Fctumjg3vexrloq2rtkkl.png" alt="GitHub repository and uploads your code" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What to expect: Your code will be visible on GitHub, and the CI/CD pipeline will automatically begin executing.&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%2F94lbtio9evjda446mq3t.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%2F94lbtio9evjda446mq3t.png" alt="Your code will be visible on GitHub" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;12. Kubernetes &lt;span id="Kubernetes"&gt; Deployments&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Create environment folders:&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; k8s/staging k8s/production
&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%2F88rnos20eh5w09jvas7e.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%2F88rnos20eh5w09jvas7e.png" alt="Kubernetes Deployments" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Staging Deployment&lt;/strong&gt;&lt;br&gt;
Create k8s/staging/deployment.yml:&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;touch &lt;/span&gt;k8s/staging/deployment.yml
&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%2Fcctz8f01up03acnz5ihi.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%2Fcctz8f01up03acnz5ihi.png" alt="Create Staging Deployment" width="800" height="272"&gt;&lt;/a&gt;&lt;br&gt;
Copy the staging deployment.yml code into this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: devops-app-staging
  namespace: staging
spec:
  replicas: 2
  selector:
    matchLabels:
      app: devops-app
      environment: staging
  template:
    metadata:
      labels:
        app: devops-app
        environment: staging
    spec:
      containers:
      - name: app
        image: ghcr.io/Anujulu/nodejs-devops:develop-latest
        ports:
        - containerPort: 3000
        &lt;span class="nb"&gt;env&lt;/span&gt;:
        - name: NODE_ENV
          value: &lt;span class="s2"&gt;"staging"&lt;/span&gt;
        - name: PORT
          value: &lt;span class="s2"&gt;"3000"&lt;/span&gt;
        resources:
          requests:
            cpu: &lt;span class="s2"&gt;"100m"&lt;/span&gt;
            memory: &lt;span class="s2"&gt;"128Mi"&lt;/span&gt;
          limits:
            cpu: &lt;span class="s2"&gt;"500m"&lt;/span&gt;
            memory: &lt;span class="s2"&gt;"256Mi"&lt;/span&gt;
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5
&lt;span class="nt"&gt;---&lt;/span&gt;
apiVersion: v1
kind: Service
metadata:
  name: devops-app-service-staging
  namespace: staging
spec:
  selector:
    app: devops-app
    environment: staging
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  &lt;span class="nb"&gt;type&lt;/span&gt;: LoadBalancer
&lt;span class="nt"&gt;---&lt;/span&gt;
apiVersion: v1
kind: Service
metadata:
  name: devops-app-service-staging
  namespace: staging
spec:
  selector:
    app: devops-app
    environment: staging
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  &lt;span class="nb"&gt;type&lt;/span&gt;: LoadBalancer
&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%2F9wpzs3lulxc0x0frl7bl.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%2F9wpzs3lulxc0x0frl7bl.png" alt="Copy the staging deployment.yml code into this file" width="800" height="467"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Create Production Deployment&lt;/strong&gt;&lt;br&gt;
Create k8s/production/deployment.yml:&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;touch &lt;/span&gt;k8s/production/deployment.yml
&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%2Fhyy9ey6ot7tr08zo0h74.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%2Fhyy9ey6ot7tr08zo0h74.png" alt="Create Production Deployment" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the production deployment.yml code into this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: devops-app-production
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: devops-app
      environment: production
  template:
    metadata:
      labels:
        app: devops-app
        environment: production
    spec:
      containers:
      - name: app
        image: ghcr.io/Anujulu/nodejs-devops:develop-latest
        ports:
        - containerPort: 3000
        &lt;span class="nb"&gt;env&lt;/span&gt;:
        - name: NODE_ENV
          value: &lt;span class="s2"&gt;"production"&lt;/span&gt;
        - name: PORT
          value: &lt;span class="s2"&gt;"3000"&lt;/span&gt;
        resources:
          requests:
            memory: &lt;span class="s2"&gt;"128Mi"&lt;/span&gt;
            cpu: &lt;span class="s2"&gt;"100m"&lt;/span&gt;
          limits:
            memory: &lt;span class="s2"&gt;"256Mi"&lt;/span&gt;
            cpu: &lt;span class="s2"&gt;"200m"&lt;/span&gt;
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5
&lt;span class="nt"&gt;---&lt;/span&gt;
apiVersion: v1
kind: Service
metadata:
  name: devops-app-service-production
  namespace: production
spec:
  selector:
    app: devops-app
    environment: production
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  &lt;span class="nb"&gt;type&lt;/span&gt;: LoadBalancer
&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%2F4ltlrj5lptsv6sgsf2pa.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%2F4ltlrj5lptsv6sgsf2pa.png" alt="Copy the production deployment.yml code into this file" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 13: Complete Deployment&lt;span id="Workflow"&gt; Workflow&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What this step does: Shows you how to use the complete CI/CD pipeline with proper branching strategy for staging and production deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Branch-based Deployment Strategy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;develop branch → Automatically deploys to staging environment&lt;/li&gt;
&lt;li&gt;main branch → Automatically deploys to production environment&lt;/li&gt;
&lt;li&gt;Pull requests → Run tests only (no deployment)
&lt;strong&gt;Deploy Changes&lt;/strong&gt;
Deploy to staging:
&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="c"&gt;# Create and switch to develop branch&lt;/span&gt;
  git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; develop
  &lt;span class="c"&gt;# Make your changes, then commit and push&lt;/span&gt;
  git add &lt;span class="nb"&gt;.&lt;/span&gt;
  git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add new feature"&lt;/span&gt;
  git push origin develop 
&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%2F9mgktfqxwuz4ehq1ybd1.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%2F9mgktfqxwuz4ehq1ybd1.png" alt="Branch-based Deployment Strategy" width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What happens: GitHub Actions automatically runs tests and deploys to staging.&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%2F2lccseprxmmara8g9mu5.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%2F2lccseprxmmara8g9mu5.png" alt="runs tests and deploys to staging." width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deploy to production:&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="c"&gt;# Switch to main branch&lt;/span&gt;
  git checkout main

  &lt;span class="c"&gt;# Merge changes from develop&lt;/span&gt;
  git merge develop

  &lt;span class="c"&gt;# Push to trigger production deployment&lt;/span&gt;
  git push origin main  
&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%2Fftws7cl49d5f8pcbpa0i.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%2Fftws7cl49d5f8pcbpa0i.png" alt="Deploy to production" width="800" height="674"&gt;&lt;/a&gt;&lt;br&gt;
What happens: GitHub Actions runs full pipeline and deploys to production.&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%2Fn6keqtxr25youantetjh.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%2Fn6keqtxr25youantetjh.png" alt="GitHub Actions runs full pipeline and deploys to production." width="800" height="329"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Monitor Deployments&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;  &lt;span class="c"&gt;# Check GitHub Actions status&lt;/span&gt;
   Visit: https://github.com/Anujulu/nodejs-devops-azure/actions

  &lt;span class="c"&gt;# Check your container registry&lt;/span&gt;
   Visit: https://github.com/Anujulu/nodejs-devops-azure/pkgs/container/nodejs-devops-azure

  &lt;span class="c"&gt;# Test your deployed applications (once you have URLs)&lt;/span&gt;
  curl https://your-staging-url.com/health      &lt;span class="c"&gt;# Staging health  check&lt;/span&gt;
  curl https://your-production-url.com/health   &lt;span class="c"&gt;# Production health check &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step &lt;strong&gt;14: Deploy to Azure Web Apps via&lt;span id="Azure"&gt; Azure Portal&lt;/span&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After building our Node.js app, containerising it with Docker, and setting up CI/CD with GitHub Actions, we deploy it to Kubernetes, now we’re ready to deploy to Azure Web Apps, a fully managed PaaS that runs our app in the cloud without managing servers or clusters.&lt;/p&gt;

&lt;h2&gt;
  
  
  App service plan
&lt;/h2&gt;

&lt;p&gt;Step-by-step guide to create an App service plan&lt;/p&gt;

&lt;p&gt;On the Azure portal, in the search bar, &lt;span id="plan"&gt;type App Services plan.&lt;/span&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%2F1s87mxrnz6m5c4o8icoa.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%2F1s87mxrnz6m5c4o8icoa.png" alt="App service plan" width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on it, then select create.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basics tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fill in the basics:&lt;/p&gt;

&lt;p&gt;Subscription – pick your active subscription.&lt;/p&gt;

&lt;p&gt;Resource Group – choose or create a new one (Nodejs-app-rg).&lt;/p&gt;

&lt;p&gt;Name – must be globally unique (Nodejs-app). &lt;/p&gt;

&lt;p&gt;Operating System – Linux.&lt;/p&gt;

&lt;p&gt;Region – pick the closest to your users. I will choose UK South.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan (Pricing tier):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free (F1) → dev/test only.&lt;/p&gt;

&lt;p&gt;Basic/Standard (B1/S1) → simple production apps.&lt;/p&gt;

&lt;p&gt;Premium (P1v3) → better performance, scaling, VNET integration.&lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;Explore pricing plans&lt;/strong&gt;, change size → pick one (e.g., Standard S1).&lt;/p&gt;

&lt;p&gt;for this demo, I will choose S1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is the best practice to tag your resource&lt;br&gt;
Name: Project&lt;br&gt;
Value: Nodejs-app&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review + create&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%2Fp6u6uey8v3unuihf4czd.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%2Fp6u6uey8v3unuihf4czd.png" alt="Basics tab" width="800" height="677"&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%2Fqpereztneu52l5q44u80.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%2Fqpereztneu52l5q44u80.png" alt="deployment is complete" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  App&lt;span id="App"&gt; Services
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;On the Azure portal in the search bar, type “App Services” and click it.&lt;/p&gt;

&lt;p&gt;Click + Create → Web App.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basics tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fill in the basics:&lt;/p&gt;

&lt;p&gt;Subscription – pick your active subscription.&lt;/p&gt;

&lt;p&gt;Resource Group – I will choose the resource group I used for the app service plan  (Nodejs-app).&lt;/p&gt;

&lt;p&gt;Name – must be globally unique (Nodejs-app).&lt;/p&gt;

&lt;p&gt;Publish – I will choose Code because I will deploy Node from my GitHub repo&lt;/p&gt;

&lt;p&gt;Runtime stack – choose Node version 22 LTS.&lt;/p&gt;

&lt;p&gt;Operating System – Linux.&lt;/p&gt;

&lt;p&gt;Region – I will choose my resource group region (UK South).&lt;/p&gt;

&lt;p&gt;Pricing plans – It will choose the plan for my app service plan&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%2F8m77w51oumh60n9b1s88.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%2F8m77w51oumh60n9b1s88.png" alt="App Services" width="612" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because I want CI/CD integration now:&lt;/p&gt;

&lt;p&gt;I will toggle Enable Continuous deployment.&lt;/p&gt;

&lt;p&gt;I will choose my organisation, which is my GitHub account&lt;/p&gt;

&lt;p&gt;I will connect my repo, which will choose my default branch (main).&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%2F1ydg4z10fs1k7ezgsl4q.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%2F1ydg4z10fs1k7ezgsl4q.png" alt="Deployment settings" width="781" height="819"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Networking: for now, I will use the default Network setting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitor and secure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enable Application Insights &lt;/p&gt;

&lt;p&gt;I have Defender for App Service already activated in my subscription&lt;/p&gt;

&lt;p&gt;Choose the Same region to avoid extra cost.&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%2Fubvvw0ij7qnn6nvigk2y.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%2Fubvvw0ij7qnn6nvigk2y.png" alt="Monitor and secure" width="765" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;&lt;br&gt;
Always remember is the best practice to tag your resource&lt;br&gt;
Name: Project&lt;br&gt;
Value: Nodejs-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%2Fhgnqu0qa877mvqyiqrqs.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%2Fhgnqu0qa877mvqyiqrqs.png" alt="Tags" width="750" height="272"&gt;&lt;/a&gt;&lt;br&gt;
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%2Fw426qbntpriucghuix4z.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%2Fw426qbntpriucghuix4z.png" alt="deployment inproress" width="800" height="214"&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%2Fbw0b6aazeizk4nvtzxe3.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%2Fbw0b6aazeizk4nvtzxe3.png" alt="deployment completed" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to resource&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Browse&lt;/strong&gt; or copy the URL to access the application in your browser&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%2Ft29mfhjxl45vpovyu5zj.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%2Ft29mfhjxl45vpovyu5zj.png" alt="Browse" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the application running in the browser:&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%2Fznxycpwyfsq2q15z4mfp.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%2Fznxycpwyfsq2q15z4mfp.png" alt=" " width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading till the end, hope you learn something.&lt;br&gt;
you can put your comment, Like and Share with your friends.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>node</category>
      <category>cloudnative</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Configure secure access to your workloads using Azure networking</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Tue, 17 Jun 2025 12:37:55 +0000</pubDate>
      <link>https://dev.to/izuabueke/configure-secure-access-to-your-workloads-using-azure-networking-1i67</link>
      <guid>https://dev.to/izuabueke/configure-secure-access-to-your-workloads-using-azure-networking-1i67</guid>
      <description>&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Introduction 
&lt;/li&gt;
&lt;li&gt;  Create and configure virtual networks 
&lt;/li&gt;
&lt;li&gt;  Configure a peer relationship between the virtual networks 
&lt;/li&gt;
&lt;li&gt;  Create and configure network security groups 
&lt;/li&gt;
&lt;li&gt;  Create Application Security Group 
&lt;/li&gt;
&lt;li&gt;  Create and Associate the Network Security Group 
&lt;/li&gt;
&lt;li&gt;  Create and configure Azure Firewall   &lt;ol&gt;
&lt;li&gt;  Create Azure Firewall subnet in our existing virtual network 
&lt;/li&gt;
&lt;li&gt;  Create an Azure Firewall 
&lt;/li&gt;
&lt;li&gt;  Add an application rule 
&lt;/li&gt;
&lt;li&gt;  Add a network rule 
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;  Configure network routing  &lt;ol&gt;

&lt;li&gt;  Create a route table
&lt;/li&gt;
&lt;li&gt; Add the route table 
&lt;/li&gt;
&lt;li&gt; Associate the route table to the subnets 
&lt;/li&gt;
&lt;li&gt; Create a route in the route table 
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt; Create DNS zones and configure DNS settings &lt;ol&gt;
&lt;li&gt; Create a private DNS zone 
&lt;/li&gt;
&lt;li&gt; Create a virtual network link to your private DNS zone
&lt;/li&gt;
&lt;li&gt; Create a DNS record set 
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdu&lt;span id="introduction"&gt;ction
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;Networking is the process of connecting computers and other devices together so they can communicate, share data, and access resources like the internet, printers, or files. In this article we will see how we can do all this in a secured way without any security vulnerabilities&lt;/p&gt;

&lt;h2&gt;
  
  
  Create and&lt;span id="networks"&gt; configure virtual
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Virtual networks&lt;/strong&gt;&lt;br&gt;
A Virtual Network (VNet) is a software-defined network in the cloud that allows Azure resources (like virtual machines, databases, apps) to communicate securely with each other, with the internet, and with on-premises networks&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of a Virtual Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolation:&lt;/strong&gt;  Each VNet is private and isolated from others.&lt;br&gt;
&lt;strong&gt;Subnets:&lt;/strong&gt; Divide the VNet into smaller sections for organization and security.&lt;br&gt;
&lt;strong&gt;Communication:&lt;/strong&gt; Resources in the same VNet can communicate directly with each other.&lt;br&gt;
&lt;strong&gt;Internet Access:&lt;/strong&gt; Public IP or NAT Gateway lets resources access the internet.&lt;br&gt;
&lt;strong&gt;On-Premises Connection&lt;/strong&gt; Connect to your physical network using VPN or ExpressRoute.&lt;br&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Use firewalls and Network Security Groups (NSGs) to control traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps on creating hub and spoke virtual networks and subnets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. *&lt;em&gt;First, we have to sign in to the Azure portal: *&lt;/em&gt; &lt;a href="https://portal.azure.com" rel="noopener noreferrer"&gt;https://portal.azure.com&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;On the Azure portal, search and select the virtual network&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dzbhe5hipkww687e1x4.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%2F7dzbhe5hipkww687e1x4.png" alt="virtual network" width="800" height="234"&gt;&lt;/a&gt;&lt;br&gt;
c. &lt;strong&gt;Select + Create and complete the configuration of the App-VNet.&lt;/strong&gt; This virtual network requires two subnets, frontend and backend. We will use the following properties and values below.&lt;br&gt;
&lt;strong&gt;On the basics,&lt;/strong&gt; select Resource group = RG1, &lt;br&gt;
Virtual network name = app-vnet, Region = East US,&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%2Fxxuxvlnplz91kkvzu1fj.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%2Fxxuxvlnplz91kkvzu1fj.png" alt="basics" width="800" height="667"&gt;&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;On the IP addresses&lt;/strong&gt; use address space below&lt;br&gt;
IPv4 address space = 10.1.0.0/16, &lt;strong&gt;then on the subnet, click edit and provide information for the frontend and save it.&lt;/strong&gt; &lt;br&gt;
Subnet name = frontend, Subnet address range = 10.1.0.0/24,&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%2Fkhy9icuf0qzwx67y6ynr.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%2Fkhy9icuf0qzwx67y6ynr.png" alt="frontend" width="800" height="319"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;after that, click on add a subnet at the top left corner and provide information for the backend and save it&lt;/strong&gt;&lt;br&gt;
Subnet name = backend, Subnet address range = 10.1.1.0/24&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%2F3d1t5wpd3m7ui3z4pdzp.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%2F3d1t5wpd3m7ui3z4pdzp.png" alt="backend" width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Leave all other settings as their defaults. When finished, select “Review + create and then Create.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t8sxo9vf6o3w1poje69.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%2F0t8sxo9vf6o3w1poje69.png" alt="Review and create and then Create" width="622" height="773"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;Create the Hub-vnet virtual network configuration.&lt;/strong&gt; This virtual network has the firewall subnet. We will use the following property and value provided below.&lt;br&gt;
Resource group = RG1, Name = hub-vnet, Region = East US&lt;br&gt;
IPv4 address space = 10.0.0.0/16, &lt;br&gt;
Subnet name = AzureFirewallSubnet,&lt;br&gt;
Subnet address range = 10.0.0.0/26&lt;br&gt;
&lt;strong&gt;On the basics&lt;/strong&gt; select Resource group = RG1, Name = hub-vnet, Region = East US&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%2F0j9syee4xtniy87vd6jj.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%2F0j9syee4xtniy87vd6jj.png" alt="basics" width="800" height="652"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;On the IP address use the IP space below&lt;/strong&gt;&lt;br&gt;
IPv4 address space = 10.0.0.0/16&lt;br&gt;
Then, on the subnet, click Edit; for the subnet purpose, choose firewall; the subnet name will change to AzureFirewallSubnet. On the starting address, make sure it is 10.0.0.0/26, then save it and review and 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%2F3cgsf5eyqma68mak7cnp.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%2F3cgsf5eyqma68mak7cnp.png" alt="IP address" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;e. &lt;strong&gt;Once the deployments are complete, search for and select your virtual networks.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fleyi7jjcryjinwvcx3x5.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%2Fleyi7jjcryjinwvcx3x5.png" alt="virtual networks" width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;f. &lt;strong&gt;Verify your virtual networks and subnets were deployed.&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%2Fp2w3jufk498n4mygjzgh.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%2Fp2w3jufk498n4mygjzgh.png" alt="subnets " width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure a peer &lt;span id="peer"&gt; relationship between the virtual networks.
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Peering&lt;/strong&gt; is a way of allowing secure, private communication between Vnets across accounts or regions.&lt;br&gt;
To peer app-vnet and hub-vnet we will follow the steps below&lt;/p&gt;

&lt;p&gt;a. &lt;strong&gt;Search for and select the app-vnet virtual network&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%2Fnimgz60c0fl6s0ny1wit.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%2Fnimgz60c0fl6s0ny1wit.png" alt="app-vnet" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;In the Settings blade, select Peerings&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%2Fmhjlh4b394q5e3pv17zu.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%2Fmhjlh4b394q5e3pv17zu.png" alt="Peerings" width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
c. &lt;strong&gt;+ Add a peering between the two virtual networks&lt;/strong&gt;.&lt;br&gt;
we will use below properties and values&lt;br&gt;
Remote peering link name = app-vnet-to-hub&lt;br&gt;
Virtual network = hub-vnet&lt;br&gt;
Local virtual network peering link name = hub-to-app-vnet&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%2Ftju88q75dcwibwc6thwm.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%2Ftju88q75dcwibwc6thwm.png" alt="Add a peering between the two virtual networks" width="650" height="772"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: Leave all other settings as their defaults. Select “Add” to create the virtual network peering.&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;Once the deployment completes, verify the peering status is connected.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq75j86qgmbzl7xsrwwq5.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%2Fq75j86qgmbzl7xsrwwq5.png" alt="verify the peering status is connected" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create and configure&lt;span id="security"&gt; network security groups.
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;We will need two Virtual machines VM1 and VM2, to achieve that, we will use Azure Cloud Shell and run the following code below by copying and past then hit enter&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   $RGName = "RG1"

   New-AzResourceGroupDeployment -ResourceGroupName $RGName -TemplateUri https://raw.githubusercontent.com/MicrosoftLearning/Configure-secure-access-to-workloads-with-Azure-virtual-networking-services/main/Instructions/Labs/azuredeploy.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note, if your Resource group name is not RG1 make sure you use the correct resource group&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the portal search for and select virtual machines. Verify both vm1 and vm2 are Running.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;vm1&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%2Fdd4flweyslj99n296yjr.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%2Fdd4flweyslj99n296yjr.png" alt="vm1" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vm2&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwwyt0kn5tah7zb12vzz.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%2Fuwwyt0kn5tah7zb12vzz.png" alt="vm2" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Application Security Group
&lt;/h2&gt;

&lt;p&gt;a. &lt;strong&gt;In the portal, search for and select Application security groups.&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%2Fqvbkw4o1mvrv1j1j2pc4.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%2Fqvbkw4o1mvrv1j1j2pc4.png" alt="ASG" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;Select + Create and configure the application security group.&lt;/strong&gt;&lt;br&gt;
We will use the following properties and values below to create an application security group.&lt;/p&gt;

&lt;p&gt;Subscription    Select your subscription&lt;br&gt;
Resource group = RG1, Name = app-frontend-asg&lt;br&gt;
Region  East US&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%2Fsz1ytxkrfhjoatbk94a6.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%2Fsz1ytxkrfhjoatbk94a6.png" alt="app-frontend-asg" width="800" height="676"&gt;&lt;/a&gt;&lt;br&gt;
c. &lt;strong&gt;Select Review + create and then select Create.&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%2Fzp4dsb13lgozkqr3geoj.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%2Fzp4dsb13lgozkqr3geoj.png" alt="Review + create" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: You are creating the application security group in the same region as the existing virtual network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Associate the application security group to the network interface of the VM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. &lt;strong&gt;In the Azure portal, search for and select VM1&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%2Fjpbk9e02o2aqg6ifxog7.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%2Fjpbk9e02o2aqg6ifxog7.png" alt="search for and select VM1" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;In the Networking blade, select Application security groups and then select Add application security groups.&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%2Fu30v36i2f41uq0luw3dc.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%2Fu30v36i2f41uq0luw3dc.png" alt="Networking blade" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c.** Select the app-frontend-asg and then select Add.**&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%2Flubvq86syvg18ed8ofn0.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%2Flubvq86syvg18ed8ofn0.png" alt="Select the app-frontend-asg and then select Add" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create and Associate the Network Security Group
&lt;/h2&gt;

&lt;p&gt;a. &lt;strong&gt;In the portal, search for and select Network security group.&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%2Fqsffqgt68wvboponw8qn.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%2Fqsffqgt68wvboponw8qn.png" alt="Network security group" width="593" height="504"&gt;&lt;/a&gt;&lt;br&gt;
b. &lt;strong&gt;Select + Create and configure the network security group.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We will use the following properties and values below to create network security group&lt;br&gt;
Subscription    Select your subscription&lt;br&gt;
Resource group = RG1, Name = app-vnet-nsg,&lt;br&gt;
Region = East US&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%2Fu94gac4sh969muh8fcpy.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%2Fu94gac4sh969muh8fcpy.png" alt="app-vnet-nsg" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. &lt;strong&gt;Select Review + create and then select Create.&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%2Fzyiragb92l8uxkpourki.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%2Fzyiragb92l8uxkpourki.png" alt="Select Review + create" width="721" height="770"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Associate the NSG with the app-vnet backend subnet.
&lt;/h2&gt;

&lt;p&gt;a. &lt;strong&gt;Select Go to resource or navigate to the app-vnet-nsg resource.&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%2Fg20uej4ibrflammw2bgo.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%2Fg20uej4ibrflammw2bgo.png" alt="app-vnet-nsg" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;In the Settings blade select Subnets.&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%2Fvv8t7e9hcwx058zdf5rw.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%2Fvv8t7e9hcwx058zdf5rw.png" alt="Settings blade select Subnets" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. &lt;strong&gt;Select + Associate&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%2F6zfq9qgiw8b0jcm7tb8f.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%2F6zfq9qgiw8b0jcm7tb8f.png" alt="Associate" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;Select app-vnet (RG1) and then the backend subnet. Select OK&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%2Fomute19e8ppqa12fpo95.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%2Fomute19e8ppqa12fpo95.png" alt="backend subnet" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Network Security Group rules
&lt;/h2&gt;

&lt;p&gt;a. In the search box at the top of the portal, enter** Network security groups**. Select Network security groups in the search results.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foyb09171w4gqybdzzbfc.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%2Foyb09171w4gqybdzzbfc.png" alt="Network security groups" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;Select app-vnet-nsg from the list of network security groups.&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%2Fz5ulpxx9gc78s6h2l7eb.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%2Fz5ulpxx9gc78s6h2l7eb.png" alt="app-vnet-nsg" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. *&lt;em&gt;In the Settings blade, select Inbound security rules.&lt;br&gt;
*&lt;/em&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%2Fjugfeu1xigslwt15q22u.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%2Fjugfeu1xigslwt15q22u.png" alt="Inbound security rules" width="800" height="201"&gt;&lt;/a&gt;&lt;br&gt;
d. &lt;strong&gt;Select + Add and configure an inbound security rule.&lt;/strong&gt;&lt;br&gt;
We will use the following properties and values below to configure an inbound security rule&lt;/p&gt;

&lt;p&gt;Source = Any, Source port ranges = *&lt;br&gt;
Destination = Application Security group,&lt;br&gt;
Destination application security group = app-frontend-asg,&lt;br&gt;
Service = SSH, Action = Allow, Priority = 100&lt;br&gt;
Name = AllowSSH&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%2Fizqn2ojwio6atxbj48vn.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%2Fizqn2ojwio6atxbj48vn.png" alt="inbound security rule" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create and configure Azure&lt;span id="Firewall"&gt; Firewall
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Azure Firewall&lt;/strong&gt; is a cloud-native network security service provided and  managed by Microsoft Azure. It helps in filtering and monitoring inbound and outbound network traffic based on security rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Azure Firewall&lt;span id="subnetex"&gt; subnet in our existing virtual network&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. In the search box at the top of the portal, enter Virtual networks. Select Virtual networks in the search results.&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%2Fo8xnv6t3lbezhor6j1rm.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%2Fo8xnv6t3lbezhor6j1rm.png" alt="Virtual networks" width="527" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Select app-vnet. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F806qmsdfhw8bn6ylzlrx.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%2F806qmsdfhw8bn6ylzlrx.png" alt="app-vnet" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. Select Subnets. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhp7tv79mgr2owqvr56k.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%2Frhp7tv79mgr2owqvr56k.png" alt="Select Subnets" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. Select + Subnet.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh44xe2r7mp2ahib89wuv.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%2Fh44xe2r7mp2ahib89wuv.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;e. Enter the following information and select Save.&lt;/p&gt;

&lt;p&gt;Name = AzureFirewallSubnet,Address range = 10.1.63.0/26&lt;br&gt;
Note: Leave all other settings as 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%2Fp7gchkquziugbu0xqlgl.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%2Fp7gchkquziugbu0xqlgl.png" alt="AzureFirewallSubnet" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an Azure&lt;span id="AzFirewall"&gt; Firewall&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. In the search box at the top of the portal, enter Firewall. Select Firewall in the search results.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn31xuj46hv92d3uy5r4x.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%2Fn31xuj46hv92d3uy5r4x.png" alt="Firewall" width="538" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Select + Create.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9hmmkz758sgrnvyaltj.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%2Fs9hmmkz758sgrnvyaltj.png" alt="Create" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. Create a firewall by using the values in the following below. For any property that is not specified, use the default value.&lt;br&gt;
Resource group = RG1, Name = app-vnet-firewall,&lt;br&gt;
Firewall SKU = Standard,&lt;br&gt;
Firewall management = Use a Firewall Policy to manage this firewall,&lt;br&gt;
Firewall policy select = Add new, Policy name = fw-policy,&lt;br&gt;
Region = East US, Policy Tier = Standard,&lt;br&gt;
Choose a virtual network = Use existing,&lt;br&gt;
Virtual network = app-vnet (RG1),&lt;br&gt;
Public IP address = Add new: fwpip&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%2Fb2ai4q66f92lav21h2p4.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%2Fb2ai4q66f92lav21h2p4.png" alt="Firewall policy" width="685" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. Select Review + create and then select 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%2Flcnppx86o3wejwax7xop.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%2Flcnppx86o3wejwax7xop.png" alt="Review + create" width="717" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update the Firewall Policy&lt;/strong&gt;&lt;br&gt;
In the portal, search for and select Firewall Policies.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c9dntmn20n03m55fzlx.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%2F7c9dntmn20n03m55fzlx.png" alt="Firewall Policy" width="538" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select fw-policy. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6wsk2dwoi3nj9hnovx9.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%2Fe6wsk2dwoi3nj9hnovx9.png" alt="fw-policy" width="800" height="191"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Add an application &lt;span id="applicationRule"&gt;rule&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
a. In the firewall policy click on policy we created, then click &lt;strong&gt;Rules&lt;/strong&gt; blade, select &lt;strong&gt;Application rules&lt;/strong&gt; and then &lt;strong&gt;Add a rule collection&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdp55zs6ltv1q2nrcl6as.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%2Fdp55zs6ltv1q2nrcl6as.png" alt="Application rules" width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Configure the application rule collection and then select Add.&lt;br&gt;
Use the following properties and values.&lt;br&gt;
Name = app-vnet-fw-rule-collection,&lt;br&gt;
Rule collection type = Application, Priority = 200,&lt;br&gt;
Rule collection action = Allow,&lt;br&gt;
Rule collection group = DefaultApplicationRuleCollectionGroup,&lt;br&gt;
Name = AllowAzurePipelines, Source type = IP address,&lt;br&gt;
Source = 10.1.0.0/23, Protocol = https,&lt;br&gt;
Destination type = FQDN,&lt;br&gt;
Destination = dev.azure.com, azure.microsoft.com,&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%2Fvvzg0xxphel1m2rndekc.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%2Fvvzg0xxphel1m2rndekc.png" alt="app-vnet-fw-rule-collection" width="800" height="320"&gt;&lt;/a&gt;&lt;br&gt;
Note: The AllowAzurePipelines rule allows the web application to access Azure Pipelines. The rule allows the web application to access the Azure DevOps service and the Azure website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a network&lt;span id="networkrules"&gt; rule&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
a. In the firewall policy click on policy we created, then click &lt;strong&gt;Rules&lt;/strong&gt; blade, select &lt;strong&gt;Network rules&lt;/strong&gt; and then &lt;strong&gt;Add a network collection.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09h24uv1bywt2we46v8z.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%2F09h24uv1bywt2we46v8z.png" alt="Network rules" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Configure the network rule and then select Add.&lt;br&gt;
Use the following properties and values.&lt;br&gt;
Name = app-vnet-fw-nrc-dns,&lt;br&gt;
Rule collection type = Network, Priority = 200,&lt;br&gt;
Rule collection action = Allow,&lt;br&gt;
Rule collection group = DefaultNetworkRuleCollectionGroup,&lt;br&gt;
Rule = AllowDns, Source = 10.1.0.0/23,&lt;br&gt;
Protocol = UDP, Destination ports = 53,&lt;br&gt;
Destination addresses = 1.1.1.1, 1.0.0.1,&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%2Fu9tljk2iheg9p23pws97.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%2Fu9tljk2iheg9p23pws97.png" alt=" rule" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify the firewall and firewall policy status&lt;/strong&gt;&lt;br&gt;
a. In the portal search for and select Firewall.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxjjo5t0skxbl19dv1b0.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%2Frxjjo5t0skxbl19dv1b0.png" alt="select Firewall" width="538" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. View the app-vnet-firewall and ensure the Provisioning state is Succeeded. This may take a few minutes.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m5rq82kkrkya30ydzha.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%2F1m5rq82kkrkya30ydzha.png" alt="Provisioning state" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. In the portal serach for and select Firewall policies.&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%2Fds3q6egdzw9pqny1m9wn.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%2Fds3q6egdzw9pqny1m9wn.png" alt="Firewall policies" width="583" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. View the fw-policy and ensure the Provisioning state is Succeeded. This may take a few 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%2Fnn0hryuxhkezbtm70wjp.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%2Fnn0hryuxhkezbtm70wjp.png" alt="Provisioning state" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure network&lt;span&gt; routing
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create a route&lt;span id="routetable"&gt; table&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Record the private IP address of app-vnet-firewall&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. In the search box at the top of the portal, enter Firewall. &lt;br&gt;
Select Firewall in the search results.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ful7ltr3t9ybhnc0jfr7v.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%2Ful7ltr3t9ybhnc0jfr7v.png" alt="enter Firewall" width="538" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Select app-vnet-firewall.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpvdt1ybb6x8cs42wa82.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%2Fxpvdt1ybb6x8cs42wa82.png" alt="app-vnet-firewall" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. Select Overview and record the Private IP address.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8ny9ijcdaww39028y2j.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%2Fr8ny9ijcdaww39028y2j.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add the route&lt;span id="Add"&gt; table&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. In the search box, enter Route tables. When Route table appears in the search results, select it.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk0xt1tgxfghn52mjiox.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%2Fpk0xt1tgxfghn52mjiox.png" alt="Route table" width="589" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. In the Route table page, select + Create and create the route table.&lt;br&gt;
using the properties and values below&lt;/p&gt;

&lt;p&gt;Resource group = RG1, Region = East US,&lt;br&gt;
Name = app-vnet-firewall-rt&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%2Fcn5w80y7xmc73rcw78uy.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%2Fcn5w80y7xmc73rcw78uy.png" alt="create the route table" width="800" height="650"&gt;&lt;/a&gt;&lt;br&gt;
c. Select Review + create and then select Create.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsope6t15t0qrhwwc2nl.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%2Fgsope6t15t0qrhwwc2nl.png" alt="Review + create" width="800" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. Wait for the route table to deploy, then select Go to resource.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17nzhiqrca92qvclwu4x.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%2F17nzhiqrca92qvclwu4x.png" alt="Go to resource" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Associate the route table&lt;span id="Associaterts"&gt; with the subnets&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
a. In the portal, continue working with the route table, select app-vnet-firewall-rt.&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%2Fwhxutxu3cw0mg2s1a9cq.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%2Fwhxutxu3cw0mg2s1a9cq.png" alt="app-vnet-firewall-rt." width="587" height="467"&gt;&lt;/a&gt;&lt;br&gt;
b. In the Settings blade, select Subnets and then + Associate.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn69jbb56y18kf5g4oif3.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%2Fn69jbb56y18kf5g4oif3.png" alt="select Subnets and then + Associate" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. ** Configure an association to the frontend subnet, then select OK.**&lt;br&gt;
use the properties and values below.&lt;br&gt;
Virtual network = app-vnet (RG1), Subnet = frontend,&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd9fth3a6cgizjxcjltb.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%2Fhd9fth3a6cgizjxcjltb.png" alt="Subnet = frontend" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;Configure an association to the backend subnet, then select OK.&lt;/strong&gt;&lt;br&gt;
use the properties and values below.&lt;br&gt;
Virtual network = app-vnet (RG1), Subnet = backend,&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0495cdu65kq8ch2xfdip.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%2F0495cdu65kq8ch2xfdip.png" alt="Subnet = backend" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a route in the&lt;span id="routet"&gt; route table&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
a. In the portal, continue working with the route table, select app-vnet-firewall-rt.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F345sqfl469xa8j1wn120.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%2F345sqfl469xa8j1wn120.png" alt="app-vnet-firewall-rt" width="589" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. In the Settings blade, select Routes and then + Add.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwktag3kthuk127mvfzv.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%2Fgwktag3kthuk127mvfzv.png" alt="select Routes and then + Add" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. Configure the route, then select Add.&lt;br&gt;
use the properties and values below.&lt;br&gt;
Route name = outbound-firewall,&lt;br&gt;
Destination type = IP addresses,&lt;br&gt;
Destination IP addresses/CIDR range = 0.0.0.0/0&lt;br&gt;
Next hop type = Virtual appliance&lt;br&gt;
Next hop address = private IP address of the firewall&lt;br&gt;
&lt;strong&gt;Note&lt;/strong&gt; on the next hop address , the IP address of the firewall is should use will be the private IP address of the app-vnet-firewall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create DNS zones and &lt;span id="DNS"&gt;configure DNS settings
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create a private&lt;span id="private"&gt; DNS zone&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
a. On the Azure portal, search for and select Private dns zones.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9wv072ptp3p41dgp5dh.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%2Fr9wv072ptp3p41dgp5dh.png" alt="Private dns zones" width="592" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Select + Create and configure the DNS zone.&lt;br&gt;
use the following properties and values.&lt;br&gt;
Resource group = RG1, Name = private.contoso.com, &lt;br&gt;
Region = East US.&lt;/p&gt;

&lt;p&gt;c. Select Review + create and then select Create.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic81bux3wjmwvq1xwwtn.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%2Fic81bux3wjmwvq1xwwtn.png" alt="Review + create" width="753" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait for the DNS zone to deploy, and then select 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%2F6e3nq6p0bjdvbzw7y3yc.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%2F6e3nq6p0bjdvbzw7y3yc.png" alt="Go to resource" width="800" height="405"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Create a virtual network link to your private DNS zone&lt;/strong&gt;&lt;br&gt;
a. In the portal, continue working on the private.contoso.com DNS zone.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fduwy9d0k3aj3zfbnej2b.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%2Fduwy9d0k3aj3zfbnej2b.png" alt="private.contoso.com" width="587" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. In the DNS Management blade, select + Virtual network links&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx29duv9l3sb0suw8vfk.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%2Fvx29duv9l3sb0suw8vfk.png" alt="Virtual network links" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6bbrl8r5bsx4uwvcuhr.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%2Ft6bbrl8r5bsx4uwvcuhr.png" alt=" " width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. Select + Add” and configure the virtual network link.&lt;br&gt;
use the following properties and values.&lt;br&gt;
Link name = app-vnet-link, Virtual network = app-vnet,&lt;br&gt;
Enable auto registration = Enabled.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnynhg89wa9qjay0vv8cx.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%2Fnynhg89wa9qjay0vv8cx.png" alt="configure the virtual network link" width="800" height="676"&gt;&lt;/a&gt;&lt;br&gt;
d. Select Create and wait for the deployment to finish. If necessary, Refresh the page.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0pq7ohekp3gjuqf8woy.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%2Ff0pq7ohekp3gjuqf8woy.png" alt="Select Create" width="800" height="676"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Create a DNS&lt;span id="record"&gt; record set&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
a. In the portal, continue working on the private.contoso.com DNS zone.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38bjgxz9w6iimxaq0h9y.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%2F38bjgxz9w6iimxaq0h9y.png" alt="continue working on the private.contoso.com" width="592" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. In the DNS Management blade, select + Recordsets.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sabwt1oapbenm5pqnj0.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%2F3sabwt1oapbenm5pqnj0.png" alt="select + Recordsets" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c. Notice that two A records have automatically been created for each of the virtual machines. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0nzbnmyibgz4u6put78.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%2Fc0nzbnmyibgz4u6put78.png" alt="Notice that two A records" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d. Select + Add and configure a record set. When finished select Add.&lt;br&gt;
use the following properties and values.&lt;br&gt;
Name = backend, Type = A, TTL = 1, IP address = 10.1.1.5,&lt;br&gt;
Note: This record set implies there is a virtual machine in app-vnet with a private IP address of 10.1.1.5.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusgcp98s30jeylasidl7.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%2Fusgcp98s30jeylasidl7.png" alt="record set implies" width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading till the end, hope you learn something.&lt;br&gt;
you can put your comment, Like and Share with your friends.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>azure</category>
      <category>cloud</category>
      <category>security</category>
    </item>
    <item>
      <title>HOW TO CREATE A WEB SERVER AND INSTALL SERVER ROLE ON A WINDOWS VIRTUAL MACHINE</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Sat, 07 Jun 2025 18:18:05 +0000</pubDate>
      <link>https://dev.to/izuabueke/how-to-create-a-web-server-and-install-server-role-on-a-windows-virtual-machine-30mg</link>
      <guid>https://dev.to/izuabueke/how-to-create-a-web-server-and-install-server-role-on-a-windows-virtual-machine-30mg</guid>
      <description>&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
 Create a Windows Virtual Machine  &lt;ol&gt;
&lt;li&gt; Configure Basics   &lt;/li&gt;
&lt;li&gt;  Configure Disks  &lt;/li&gt;
&lt;li&gt;  Configure Networking  &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;  Connect to Your VM via RDP  &lt;/li&gt;
&lt;li&gt;  Install Web Server Role (IIS)  &lt;/li&gt;

&lt;li&gt;  Increase the VM memory  &lt;/li&gt;

&lt;li&gt;  Remove the Windows Server IIS &lt;/li&gt;
&lt;/ul&gt;
 

&lt;h2&gt;
  
  
  Step-by-Step Guide.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step1:&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Windows &lt;span id="Windows"&gt; Virtual Machine in Azure
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;To create a Windows Virtual Machine, in the search bar, type and select Windows Server.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsymy82w939ngqmg6oom.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%2Fcsymy82w939ngqmg6oom.png" alt="Windows Server" width="764" height="421"&gt;&lt;/a&gt;&lt;br&gt;
On the page, click Create and select Virtual Machine.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5q209xzwinatar4x6f8b.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%2F5q209xzwinatar4x6f8b.png" alt="Create and select Virtual Machine" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure &lt;span id="Basics"&gt; Basics
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Project details:&lt;/strong&gt; I will choose my subscription and resource group (or create a new one).&lt;br&gt;
In this case, I will create a new one with the name RG&lt;br&gt;
&lt;strong&gt;Instance details:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;VM name&lt;/strong&gt; (e.g., WebServerVM)&lt;br&gt;
&lt;strong&gt;Region&lt;/strong&gt; (I will choose the closest location )&lt;br&gt;
&lt;strong&gt;Availability options:&lt;/strong&gt; Leave default&lt;br&gt;
&lt;strong&gt;Image:&lt;/strong&gt; Windows Server 2025 Datacenter, which is the  latest&lt;br&gt;
&lt;strong&gt;Size:&lt;/strong&gt; Choose an appropriate size (e.g., Standard B1s for testing)&lt;br&gt;
&lt;strong&gt;Note&lt;/strong&gt; If you use Standard B1s, there will be an error in the installation of the IIS Web Server. There are two ways to solve this challenge, first, from the creation choose the size from Standard_DS1_v2 and above.&lt;br&gt;
Second, after creation, from the VM settings, increase the memory.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1yui7fkr3pmgckdpy5f.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%2Fh1yui7fkr3pmgckdpy5f.png" alt="Configure Basics" width="721" height="796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Basics
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Administrator account&lt;/strong&gt;&lt;br&gt;
This is where I will provide my login details, which will include&lt;br&gt;
Username and Password&lt;br&gt;
Confirm password&lt;br&gt;
&lt;strong&gt;Inbound port rules&lt;/strong&gt;&lt;br&gt;
Select which virtual machine network ports are accessible from the public internet. You can specify more limited or granular network access on the Networking tab.&lt;br&gt;
Public inbound ports:&lt;br&gt;
None&lt;br&gt;
Allow selected ports&lt;/p&gt;

&lt;p&gt;Select inbound ports: You can select one or more.&lt;br&gt;
RDP (3389) HTTP (80) HTTPS (443)&lt;br&gt;
SSH (22)&lt;br&gt;
This will allow all IP addresses to access your virtual machine.  This is only recommended for testing.  Use the Advanced controls in the Networking tab to create rules to limit inbound traffic to known IP addresses. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9g86u4q0sck7vwdpof6.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%2Fz9g86u4q0sck7vwdpof6.png" alt="Administrator account" width="799" height="652"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Configure &lt;span id="Disks"&gt; Disks
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;Use defaults unless you have special requirements.&lt;br&gt;
OS disk&lt;br&gt;
&lt;strong&gt;OS disk size:&lt;/strong&gt; The choice of disk size is dependent on your needs. but the Image default is(127 GiB)&lt;br&gt;
&lt;strong&gt;OS disk type:&lt;/strong&gt; This disk type is dependent on your workload, for the purpose of this web server i will use Standard SSD (locally-redundant storage).&lt;/p&gt;

&lt;p&gt;Data disks for WebServerVM&lt;br&gt;
You can add and configure additional data disks for your virtual machine or attach existing disks. This VM also comes with a temporary disk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create and attach a new disk&lt;/strong&gt;.&lt;br&gt;
To create a new disk, all you have to do is  click on Create it will open another page where you can file Name&lt;br&gt;
WebServerVM_DataDisk_0, choose Source type, then click on change size to choose the Size you need and select ok.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attach an existing disk&lt;/strong&gt;&lt;br&gt;
When you click on attach, it will show you the list of existing disks you one&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qhv5fujecfte5yz4whn.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%2F0qhv5fujecfte5yz4whn.png" alt="Configure Disks" width="710" height="862"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure &lt;span id="Networking"&gt; Networking
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;A Virtual Network (VNet) is a software-defined network in the cloud that allows Azure resources (like virtual machines, databases, apps) to communicate securely with each other, with the internet, and with on-premises networks.&lt;br&gt;
I will discuss more about Networking later.&lt;br&gt;
Virtual network: New or existing&lt;br&gt;
Subnet: Default&lt;br&gt;
Public IP: Create new (name like webserverpublicip)&lt;br&gt;
NIC network security group: Choose Basic or Advanced&lt;br&gt;
If using basic, allow HTTP (Port 80) and RDP (Port 3389) by checking the boxes below. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qqb9smbtukmmt5wbos6.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%2F9qqb9smbtukmmt5wbos6.png" alt=" " width="800" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Review and Create&lt;br&gt;
Click Create&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ggj4qlsmk9r0kchhljk.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%2F2ggj4qlsmk9r0kchhljk.png" alt="Click Create" width="728" height="870"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Connect to Your &lt;span id="RDP"&gt; VM via RDP
&lt;/span&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to the VM Overview page&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%2F8og4fg7dfiprxkhean9r.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%2F8og4fg7dfiprxkhean9r.png" alt="Go to the VM" width="800" height="437"&gt;&lt;/a&gt;&lt;br&gt;
Once deployment is complete, click Connect &amp;gt; RDP&lt;br&gt;
Download the RDP file.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1on2jrx2epxx8p2lg33.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%2Fg1on2jrx2epxx8p2lg33.png" alt="Connect &amp;gt; RDP" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Download, open the file and click connect&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffakubf08cb6r8w1j867j.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%2Ffakubf08cb6r8w1j867j.png" alt="open the file" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in with the credentials you set during creation&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%2Fvyciocwaxpjy4bquqdrx.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%2Fvyciocwaxpjy4bquqdrx.png" alt=" " width="681" height="600"&gt;&lt;/a&gt;&lt;br&gt;
Once you are connected to your machine using remote desktop protocol(rdp) file and you are now on the desktop page, you can test your virtual machine for web server by copying the the public ip address and running it on a browser.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rl4sg3vr5ifmxvrtd4y.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%2F2rl4sg3vr5ifmxvrtd4y.png" alt="public ip address" width="800" height="721"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Note&lt;/strong&gt; this may fail because of two things: one web server has not been installed, which is true in this case.&lt;br&gt;
Two, if HTTP Inbound port rules have not been created or are set to deny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Install Web &lt;span id="IIS"&gt; Server Role (IIS)
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;Open Server Manager&lt;br&gt;
When you log in to the VM, the Server Manager will open automatically after login, but if it does not, search for Server Manager in the search bar and click it.&lt;br&gt;
&lt;strong&gt;Add Roles and Features&lt;/strong&gt;&lt;br&gt;
On Server Manager, in the top right corner, click on Manage, Add Roles and Features.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcmqp5ycwqa7l4stdp2he.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%2Fcmqp5ycwqa7l4stdp2he.png" alt="Add Roles and Features." width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow the Wizard&lt;/strong&gt;&lt;br&gt;
Before You Begin : Next&lt;br&gt;
Select installation type : Role-based or feature-based installation → Next&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsc0yrj90sbxz5b1nezg3.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%2Fsc0yrj90sbxz5b1nezg3.png" alt=" " width="800" height="573"&gt;&lt;/a&gt;&lt;br&gt;
Select destination server : Pick your server → Next&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz3l9oz53vefziomp838.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%2Fyz3l9oz53vefziomp838.png" alt="destination" width="800" height="573"&gt;&lt;/a&gt;&lt;br&gt;
Select server roles : Check Web Server (IIS)&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%2Fv8natdtzyvw9cnwlmw0y.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%2Fv8natdtzyvw9cnwlmw0y.png" alt=" " width="800" height="531"&gt;&lt;/a&gt;&lt;br&gt;
A popup appears; accept adding required features&lt;br&gt;
Select features : Leave default unless you need something specific&lt;br&gt;
Confirm installation selections : Next&lt;br&gt;
Install&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50jmr66ak81tp497fyge.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%2F50jmr66ak81tp497fyge.png" alt="Install" width="800" height="571"&gt;&lt;/a&gt;&lt;br&gt;
Wait while IIS installs.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flg55174gjkffyf1100c2.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%2Flg55174gjkffyf1100c2.png" alt="IIS installs" width="800" height="565"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Note&lt;/strong&gt;: The installation failed while installing it through the server manager because of low memory in the VM. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Likewise, installation through PowerShell&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I install it through PowerShell, on the search bar type PowerShell, right click on it and select Run as administrator.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8xaj0xpeq6papvgqeaf.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%2Fa8xaj0xpeq6papvgqeaf.png" alt=" " width="800" height="918"&gt;&lt;/a&gt;&lt;br&gt;
Once the PowerShell pane opens, type in the following code: Install-WindowsFeature Web-Server.&lt;/p&gt;

&lt;p&gt;Note that it is case sensitive.&lt;br&gt;
The start installation will be displayed&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2vaozwbvixgailwaocf.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%2Fj2vaozwbvixgailwaocf.png" alt=" " width="800" height="186"&gt;&lt;/a&gt;&lt;br&gt;
After the installation, you will see this&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe35l64lz5sphr89eyjvn.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%2Fe35l64lz5sphr89eyjvn.png" alt=" " width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; This installation failed because in the &lt;strong&gt;Instance details&lt;/strong&gt; section on &lt;strong&gt;Size&lt;/strong&gt; I Choose &lt;em&gt;Standard B1s&lt;/em&gt; which have low memory.&lt;br&gt;
As I said before, there are two ways to solve this challenge, first, from the creation choose the size from Standard_DS1_v2 and above.&lt;br&gt;
Second, after creation, from the VM settings, increase the memory.&lt;/p&gt;

&lt;p&gt;Increase the &lt;span id="Increase"&gt; VM memory&lt;br&gt;
Type PC and right-click on This PC/My Computer, click on Properties &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboiu23vjrdjwidl8ru78.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%2Fboiu23vjrdjwidl8ru78.png" alt="Properties" width="800" height="701"&gt;&lt;/a&gt;&lt;br&gt;
 On the next page, scroll to Advanced system settings and click it.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fda6shcfymi9nu0jbm2vd.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%2Fda6shcfymi9nu0jbm2vd.png" alt="Properties" width="800" height="636"&gt;&lt;/a&gt;&lt;br&gt;
Under the Advanced tab → click Settings under Performance.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3ekstt9xd73p6sgunh4.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%2Fb3ekstt9xd73p6sgunh4.png" alt="Settings" width="600" height="714"&gt;&lt;/a&gt;&lt;br&gt;
Go to the Advanced tab again → click Change under Virtual memory.&lt;/span&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%2F4yls25wc7hpvazb5l605.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%2F4yls25wc7hpvazb5l605.png" alt="Virtual memory" width="584" height="966"&gt;&lt;/a&gt;&lt;br&gt;
Uncheck Automatically manage paging file size for all drives .&lt;br&gt;
Select the system drive (usually C:) → choose Custom size .&lt;br&gt;
Set a larger Initial size (MB) and Maximum size (MB) .&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy875cy6awts6lfcinwa2.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%2Fy875cy6awts6lfcinwa2.png" alt=" " width="568" height="854"&gt;&lt;/a&gt;&lt;br&gt;
Click ok on all the pop-ups, on the last one after clicking ok then click close.&lt;/p&gt;

&lt;p&gt;I have increased my VM memory. I will restart the VM and go to the server manager and click on Manage, then Add Role and Feature, complete the steps, and this is the result &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4rwo7o36lo12yzb7tcv9.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%2F4rwo7o36lo12yzb7tcv9.png" alt="complete the steps" width="800" height="583"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Remove the Windows &lt;span id="Remove"&gt; Server IIS
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;From the Server Manager, select Manage, click Remove Roles and Features.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1m57x7autw4gf41izl1.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%2Fx1m57x7autw4gf41izl1.png" alt="Remove Roles" width="800" height="155"&gt;&lt;/a&gt; &lt;br&gt;
On Before you begin, click Next and Next&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy42fs4cx325kbhv5z8ax.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%2Fy42fs4cx325kbhv5z8ax.png" alt=" " width="800" height="574"&gt;&lt;/a&gt;&lt;br&gt;
On the server Role, uncheck the box and click next and next&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljhu52ollzl7zmd4j3zi.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%2Fljhu52ollzl7zmd4j3zi.png" alt="server Role" width="800" height="572"&gt;&lt;/a&gt;&lt;br&gt;
On the Confirmation, click Remove&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbacijkzpr7vzgi53dbt.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%2Fhbacijkzpr7vzgi53dbt.png" alt="Confirmation" width="800" height="568"&gt;&lt;/a&gt;&lt;br&gt;
The removal will be initiated &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v6kfkn36rc5wtydnz9x.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%2F4v6kfkn36rc5wtydnz9x.png" alt="initiated" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Removal completed&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gbth3grq84cwomf11ja.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%2F7gbth3grq84cwomf11ja.png" alt="Removal completed" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now that I have increased the VM memory, let's install Windows Server IIS through PowerShell&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I will install it through PowerShell again. In the search bar, type PowerShell, right click on it and select Run as administrator.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8xaj0xpeq6papvgqeaf.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%2Fa8xaj0xpeq6papvgqeaf.png" alt=" " width="800" height="918"&gt;&lt;/a&gt;&lt;br&gt;
Once the PowerShell pane opens, type in the following code: Install-WindowsFeature -name Web-Server -IncludeManagementTools.&lt;/p&gt;

&lt;p&gt;Note that it is case sensitive.&lt;br&gt;
The start installation will be displayed&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%2Fc7e3x5guxpriew7c8d1p.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%2Fc7e3x5guxpriew7c8d1p.png" alt="start installation" width="800" height="267"&gt;&lt;/a&gt;&lt;br&gt;
After the installation, you will see this.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffe4pty1w2ixl7rw93dqu.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%2Ffe4pty1w2ixl7rw93dqu.png" alt="After the installation" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Test the Web Server
&lt;/h2&gt;

&lt;p&gt;copying the public IP address &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mdab3fhvz91jqnn422g.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%2F8mdab3fhvz91jqnn422g.png" alt=" " width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;searching it on a browser&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2yn27uldd7co41yq5c8.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%2Fh2yn27uldd7co41yq5c8.png" alt="browser" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading till the end, hope you learn something.&lt;br&gt;
you can put your comment, Like and Share with your friends.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>webserver</category>
      <category>cloud</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Active Directory Domain Services (Part 2)</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Fri, 06 Jun 2025 21:59:21 +0000</pubDate>
      <link>https://dev.to/izuabueke/active-directory-domain-services-part-2-31od</link>
      <guid>https://dev.to/izuabueke/active-directory-domain-services-part-2-31od</guid>
      <description>&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; 
 Organizational Units (OUs)  
&lt;/li&gt;
&lt;li&gt; 
 Step by step guide to create Organizational Units (OUs) 
&lt;/li&gt;
&lt;li&gt;  Nested OUs 
&lt;/li&gt;
&lt;li&gt;  Create Users 
&lt;/li&gt;
&lt;li&gt;  Account Expiration 
&lt;/li&gt;
&lt;li&gt;  Create the User Admins group 
&lt;/li&gt;
&lt;li&gt;  Configure a user as a Protected User 
&lt;/li&gt;
&lt;li&gt;  Delegate Security Permissions 
&lt;/li&gt;
&lt;li&gt;  Configure City Attribute for a User 
&lt;/li&gt;
&lt;li&gt;  Configure Domain Password Policy 
&lt;/li&gt;
&lt;li&gt;  Configure Fine-Grained Password Policy 
&lt;/li&gt;
&lt;li&gt;  Enable Active Directory Recycle Bin 
&lt;/li&gt;
&lt;li&gt;  Configure security settings 
&lt;/li&gt;
&lt;li&gt;  Audit User Account Management in USA 
&lt;/li&gt;
&lt;li&gt;  Deny Log On As a Service 
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Organizational &lt;span id="OUs"&gt; Units (OUs)&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
Organizational units are containers within a domain that are used to organize and manage objects like users, groups, computers, and other OUs. They are important in structuring and managing an Active Directory environment by allowing administrators to apply specific policies, delegate administrative tasks, and logically group objects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step guide to &lt;span id="Step by step guide"&gt; create Organizational Units (OUs)
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;On the top right side, locate Tools and click on it; on the drop-down, click on Active Directory Users and Computers.&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%2Fynexiuzapaiir4breoo5.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%2Fynexiuzapaiir4breoo5.png" alt="locate Tools" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;once you open the Active Directory Users and Computers you will see your domain. If you click on it, you will now see a drop-down with some default OUs like built-in, Computer, Users etc.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvnsn42maouc4x4hl2ox.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%2Fcvnsn42maouc4x4hl2ox.png" alt="default OUs" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now let's create our own OUs&lt;/strong&gt;&lt;br&gt;
There are two ways you can create an OU. &lt;br&gt;
First, you can create it by right-clicking on your domain name, select New, and then click on Organizational Unit and providing a name for your OU and click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9eodsxbtbj219mwcuvq.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%2Fb9eodsxbtbj219mwcuvq.png" alt="create an OU" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second way is by highlighting your domain and go to the top and click on "Create a new organizational unit in the current container." You will see a pop-up; prove your OU name and click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipi2tdk46mk3611py0qo.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%2Fipi2tdk46mk3611py0qo.png" alt="The second way" width="800" height="463"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nested&lt;span id="Nested"&gt; OUs&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
The next thing we will do is to create three (3) nested OUs inside &lt;strong&gt;USA&lt;/strong&gt;, which are Computer, Users, and Server.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo00oqk1s0qlhziv9e9b0.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%2Fo00oqk1s0qlhziv9e9b0.png" alt="nested OUs" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I will use the same steps above to create two more UOs, which are the UK and France.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77g12vjbvhc69nk8ut54.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%2F77g12vjbvhc69nk8ut54.png" alt="create two more UOs" width="757" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create&lt;span id="Users"&gt; Users&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
To create a user, right-click on users, go to New, select user, provide the user's first name, last name, and user logon name.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foyu2xhhbdq2v3sz5l1j6.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%2Foyu2xhhbdq2v3sz5l1j6.png" alt="first name" width="800" height="453"&gt;&lt;/a&gt;  select Next, provide password.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwuv37g844prrftc3hay.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%2Fnwuv37g844prrftc3hay.png" alt="provide password" width="800" height="439"&gt;&lt;/a&gt; and click Finish.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vod0xaftpiqtywgoszk.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%2F6vod0xaftpiqtywgoszk.png" alt="click Finish" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I will use the same steps above to create two more users, one in the UK (Oliver Smith)  and the other in France (Sophie Martin).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Account &lt;span id="Account"&gt;Expiration Date&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
You can set an expiring date for a user account if you are creating an account for a user that have a contract with an end date, it will be best to set the expiring date to the contract end date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Happens When a User Account Expires?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Authentication Fails :&lt;br&gt;
The user will not be able to log in to any domain-joined computers.&lt;br&gt;
They cannot access domain resources like shared folders, printers, or applications requiring domain authentication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mail Access (if using Exchange) :&lt;br&gt;
If the user has an Exchange mailbox, they won’t be able to send or receive emails unless the mailbox is reconnected to another active account or accessed via delegation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access Revoked :&lt;br&gt;
Any permissions or group memberships associated with the account are still present in AD, but the user can't use them until the account is re-enabled or the expiration date is updated.&lt;br&gt;
&lt;strong&gt;To set account expiration&lt;/strong&gt;, select the user OU. In the user OU, double-click the John white user account. In the Account tab, in the Account expires section, select End of: and set the date to Jan 1, 2030. Click OK.&lt;/p&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%2Fx7au5ihczpgv4vu25bxj.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%2Fx7au5ihczpgv4vu25bxj.png" alt="Account expiration" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: To log on as a user, you have to provide your user logon name and password, which at first you will change.&lt;/p&gt;

&lt;p&gt;These two ways of creating both OUs, users, groups, etc., are ok; you can even use them to create nested OUs, etc. But I will recommend that you use the first method if you are a beginner. For instance, if you want to delegate control with the second method, you will highlight and then select the Action at the top before you see delegate, but with the first, you will just right click and select delegation of control&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the &lt;span id="Admins"&gt;User Admins group&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Groups&lt;/strong&gt;&lt;br&gt;
There are three (3) scopes of groups, but we will focus on two: universal and global.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Universal Groups: This group covers all accounts from the domain in the same forest, including global groups in the same forest; for example, if you have two or three domains or even more in the same forest, both universal and global, and you create an IT group with the scope of universal, it will manage all the domains. &lt;/li&gt;
&lt;li&gt;Global Groups: When you create a group with the scope of global, it will only apply to the domain where you created it in the same forest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Group Types&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are two types of groups, which are security groups and distribution groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distribution groups&lt;/strong&gt;: It is used to create email distribution lists to send an email to a collection of users by using an email application like Exchange Server.&lt;br&gt;
To create this group, right-click on users, go to New, select group, provide the group name, ensure distribution is selected, and click Ok.&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%2Fdvxm8sswgzmkodd4fbdr.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%2Fdvxm8sswgzmkodd4fbdr.png" alt="Dis_lis" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security groups:&lt;/strong&gt; This group is used to assign permissions.&lt;br&gt;
To create this group, right-click on users, go to New, select group, provide the group name (IT Admin), select Universal in group scope and ensure security is selected, and click Ok.&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%2Fqjfw8907it7jv15n4gtu.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%2Fqjfw8907it7jv15n4gtu.png" alt="IT Admin" width="630" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the User OU, double-click the John White User account. In the Member Of tab, click Add.&lt;br&gt;
Type IT Admin.&lt;br&gt;
Click Check Names.&lt;br&gt;
Click OK, &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%2F53zjxgeu4sj47068dsxm.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%2F53zjxgeu4sj47068dsxm.png" alt="IT Admin" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;then click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a95p1ujh7r21mexh3tp.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%2F1a95p1ujh7r21mexh3tp.png" alt="click OK" width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure a user&lt;span id="Protected"&gt; as a Protected User&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
In this task, you configure the John White user account as a protected user.&lt;br&gt;
** steps:**&lt;br&gt;
In Demom.local, open Active Directory Users and Computers (or Administrative Center).&lt;br&gt;
Navigate to the USA OU, select Users and double-click the John White User account. In the Member Of tab, click Add.&lt;br&gt;
Type Protected Users. Click Check Names. Click OK, &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%2Fx01tf53pv79q8m9k8b9s.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%2Fx01tf53pv79q8m9k8b9s.png" alt="Protected Users." width="800" height="568"&gt;&lt;/a&gt;&lt;br&gt;
then click OK.&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%2Fpxvk3mvjhkmm6m0rql44.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%2Fpxvk3mvjhkmm6m0rql44.png" alt="then click OK" width="749" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Delegate Security&lt;span id="Delegate"&gt; Permissions to an OU to a security group
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will delegate the ability to reset passwords and force password change to the IT Admin group over accounts in the USA OU.&lt;br&gt;
Steps:&lt;br&gt;
Open Active Directory Users and Computers, In Demom.loca .&lt;br&gt;
Right-click the USA OU and click &lt;strong&gt;Delegate Control&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%2Flk5p19n0lem1semm1fe1.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%2Flk5p19n0lem1semm1fe1.png" alt="Delegate Control" width="737" height="572"&gt;&lt;/a&gt;&lt;br&gt;
On the Welcome page of the Delegation of Control Wizard, click Next.&lt;br&gt;
Click Add and type IT Admin. Click Check Names. Click OK &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%2Fnb1u1s6jjyvf0uamz1o1.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%2Fnb1u1s6jjyvf0uamz1o1.png" alt="type IT Admin" width="800" height="440"&gt;&lt;/a&gt;&lt;br&gt;
and click Next.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzom7uos8v4jt7prqf4z.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%2Fhzom7uos8v4jt7prqf4z.png" alt="click Next" width="784" height="580"&gt;&lt;/a&gt;&lt;br&gt;
On the Tasks to Delegate page, select the Reset user passwords and force password change at next logon option. Click Next.&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%2Fgcmu3e99ex6drfueee19.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%2Fgcmu3e99ex6drfueee19.png" alt="Click Next" width="800" height="558"&gt;&lt;/a&gt;&lt;br&gt;
Click Finish.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtsoz6suf7bohrji8x45.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%2Fvtsoz6suf7bohrji8x45.png" alt="Click Finish" width="778" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure City &lt;span id="Attribute"&gt;Attribute for a User
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will configure a city attribute for a user account and then use the Find attribute to verify that the user is present.&lt;/p&gt;

&lt;p&gt;Open Active Directory Users and Computers, In Demom.loca.&lt;br&gt;
Select the USA OU, select Users and right-click the John White user account, and click Properties.&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%2Fskwiive1fzyr47i11kmm.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%2Fskwiive1fzyr47i11kmm.png" alt="click Properties" width="800" height="477"&gt;&lt;/a&gt;&lt;br&gt;
In the Address tab of the John White properties, set the City field to USA and click OK.&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%2Fw9bk2r9t08mefk50sdh3.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%2Fw9bk2r9t08mefk50sdh3.png" alt=" City field to USA" width="776" height="706"&gt;&lt;/a&gt;&lt;br&gt;
In Active Directory Users and Computers, right-click Demom.local and click Find.&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%2F3jv8sfv4ju8t383ckscx.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%2F3jv8sfv4ju8t383ckscx.png" alt="click Find" width="800" height="609"&gt;&lt;/a&gt;&lt;br&gt;
In the Advanced tab of the Find Users, Contacts, and Groups dialog box, select Field, then User, then City. Set Condition to Is (exactly). Set Value to USA. Click Find Now.&lt;br&gt;
Click Yes on the Find in the Directory pop-up.&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%2Fdw4yph44llj0pstp6eqj.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%2Fdw4yph44llj0pstp6eqj.png" alt="Directory pop-up" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify that user John White is listed in the Search results.&lt;br&gt;
Close the Find Users, Contacts, and Groups dialog box.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jwgr7imbkw2b183dzkx.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%2F3jwgr7imbkw2b183dzkx.png" alt="John White is listed" width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disable the Oliver Smith User
&lt;/h2&gt;

&lt;p&gt;In this task, I will disable the Oliver Smith user&lt;br&gt;
Open Active Directory Users and Computers, in Demom.local. and then open the UK OU.&lt;br&gt;
In the UK OU, select users and right-click Oliver Smith and click Disable Account.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsclobywyif6qrtrjiur0.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%2Fsclobywyif6qrtrjiur0.png" alt="Disable Account" width="784" height="459"&gt;&lt;/a&gt;&lt;br&gt;
Click OK.&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%2Fpi0d9h3t15w9f3ggbh9u.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%2Fpi0d9h3t15w9f3ggbh9u.png" alt="Click OK" width="767" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reset the password of the Sophie Martin User
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;In this task, you reset the password of the Sophie Martin user&lt;/strong&gt;.&lt;br&gt;
Open Active Directory Users and Computers, in Demom.local. and then open the France OU. select users and Right-click the Sophie Martin user and select 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%2Fnbyk6mncykqrz8ozln0x.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%2Fnbyk6mncykqrz8ozln0x.png" alt="Reset Password" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
On the Reset Password dialog box, type the password Pa66w.rdPa66w.rd twice and select OK.&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%2Fvbjb045h7jwvhonvxh41.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%2Fvbjb045h7jwvhonvxh41.png" alt="select OK" width="800" height="590"&gt;&lt;/a&gt;&lt;br&gt;
Click OK again in the dialog that notifies you that the password has been changed.&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%2Frlg115sqlv5z2mmwtc43.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%2Frlg115sqlv5z2mmwtc43.png" alt="Click OK again" width="749" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Domain&lt;span id="Password"&gt; Password Policy
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will configure the domain password policy.&lt;br&gt;
In the search bar of your Windows Server, Type &lt;strong&gt;Group Policy management&lt;/strong&gt;. You will see a pop-up; click on  Group Policy management.&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%2F6qnrghhh629p9pxfbv46.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%2F6qnrghhh629p9pxfbv46.png" alt="Group Policy management" width="800" height="601"&gt;&lt;/a&gt;&lt;br&gt;
In the Group Policy Management console, expand the Demom.local forest, the Domains folder, and the Demom.local domain, then Right-click Default Domain Policy and click Edit.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdm3vbzp1po11gvkt7lzb.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%2Fdm3vbzp1po11gvkt7lzb.png" alt="click Edit" width="770" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Group Policy Management Editor, navigate to Computer Configuration\Policies\Windows Settings\Security Settings\Account Policies\Password Policy. Double-click the Minimum password length policy item, change the minimum number of characters to 14, click Ok, and then close the Group Policy Management Editor window.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3gx3qreuczwb5pjwcu1.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%2Fj3gx3qreuczwb5pjwcu1.png" alt="Minimum password length" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure&lt;span id="Fine-Grained"&gt; Fine-Grained Password Policy
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will configure a fine-grained password policy and apply it to the Domain Admins group.&lt;br&gt;
In the search bar of your Windows Server, Type &lt;strong&gt;Active Directory Administrative Center&lt;/strong&gt;. You will see a pop-up; click on Active Directory Administrative Center.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsarrchyrdeaitii1sq1a.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%2Fsarrchyrdeaitii1sq1a.png" alt="Active Directory Administrative Center" width="800" height="563"&gt;&lt;/a&gt;&lt;br&gt;
Under Overview, Click Demom (local).&lt;br&gt;
In the Demom (local) pane, open the System container.&lt;br&gt;
In the System container, open the Password Settings Container.&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%2Fuwvg7xdpaawkpnh227yh.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%2Fuwvg7xdpaawkpnh227yh.png" alt="Demom" width="800" height="469"&gt;&lt;/a&gt;&lt;br&gt;
Right-click the Password Settings Container, click New, and then click Password Settings.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ob84crgmrnkajy94a65.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%2F0ob84crgmrnkajy94a65.png" alt="Password Settings" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
In the Name field, type Domain Admin Password Policy. Set the Precedence field to 1.&lt;br&gt;
Set minimum password length to 16.&lt;br&gt;
Click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevnw5ar6f6smeycwvnw6.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%2Fevnw5ar6f6smeycwvnw6.png" alt="Click OK" width="800" height="390"&gt;&lt;/a&gt;&lt;br&gt;
Open the new policy Domain Admins Password Policy.&lt;br&gt;
In the Directly Applies to section, click Add, then type Domain Admins. Click Check Names and click OK.&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%2Fq2ujtj94hgltske5iz26.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%2Fq2ujtj94hgltske5iz26.png" alt="type Domain Admins" width="800" height="581"&gt;&lt;/a&gt;&lt;br&gt;
Click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fqqqozni65w1ywf3tfb.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%2F2fqqqozni65w1ywf3tfb.png" alt="Click OK" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enable Active&lt;span id="Recycle"&gt; Directory Recycle Bin
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will enable the Active Directory Recycle Bin&lt;br&gt;
In the search bar of your Windows Server, Type &lt;strong&gt;Active Directory Administrative Center&lt;/strong&gt;. You will see a pop-up; click on Active Directory Administrative Center.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsarrchyrdeaitii1sq1a.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%2Fsarrchyrdeaitii1sq1a.png" alt="Active Directory Administrative Center" width="800" height="563"&gt;&lt;/a&gt;&lt;br&gt;
Click Demom (local) in the left pane.&lt;br&gt;
In the right pane, select Enable Recycle Bin.&lt;br&gt;
Click OK to dismiss the warning.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5y8ejqkjedv9mg4elim.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%2Fa5y8ejqkjedv9mg4elim.png" alt="dismiss the warning" width="800" height="499"&gt;&lt;/a&gt;&lt;br&gt;
Click OK to dismiss the warning about replication latency.&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%2Fyyilguao6vve98y1rw4e.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%2Fyyilguao6vve98y1rw4e.png" alt="Click OK" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure &lt;span id="ssettings"&gt;security settings
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this exercise, I will configure settings related to security, including disabling NTLM authentication for domain accounts, auditing account management activity, and denying log on as a service for members of a security group.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restrict NTLM Authentication
&lt;/h2&gt;

&lt;p&gt;In this task, I will restrict NTLM authentication.&lt;br&gt;
In the search bar of your Windows Server, Type &lt;strong&gt;Group Policy management&lt;/strong&gt;. You will see a pop-up; click on  Group Policy management.&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%2F6qnrghhh629p9pxfbv46.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%2F6qnrghhh629p9pxfbv46.png" alt="Group Policy management" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Group Policy Management console, expand the Demom.local forest, the Domains folder, and the Demom.local domain, then Right-click Default Domain Policy and click Edit.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdm3vbzp1po11gvkt7lzb.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%2Fdm3vbzp1po11gvkt7lzb.png" alt="click Edit" width="770" height="532"&gt;&lt;/a&gt;&lt;br&gt;
Navigate to Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Security Options.&lt;br&gt;
Select and double-click Network security: Restrict NTLM: NTLM authentication in this domain.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccipvnd63xouk3t32fn5.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%2Fccipvnd63xouk3t32fn5.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the Define this policy setting check box.&lt;br&gt;
Select the value Deny all and click OK.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvms5difz8jo1w86cp6ah.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%2Fvms5difz8jo1w86cp6ah.png" alt="Deny all and click OK" width="425" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Yes in the Confirm Setting Change dialog box.&lt;br&gt;
Close the Group Policy Management Editor.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzjqzmnxteec9iu0w9xr.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%2Fhzjqzmnxteec9iu0w9xr.png" alt="Click Yes" width="427" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit User Account&lt;span id="Audit"&gt; Management in USA
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will enable auditing of User Account Management in the USA OU&lt;br&gt;
In the search bar of your Windows Server, Type &lt;strong&gt;Group Policy management&lt;/strong&gt;. You will see a pop-up; click on  Group Policy management.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qnrghhh629p9pxfbv46.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%2F6qnrghhh629p9pxfbv46.png" alt="Group Policy management" width="800" height="601"&gt;&lt;/a&gt;&lt;br&gt;
Navigate to the USA OU, right-click and select Create a GPO in this domain, and link it here….&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%2Fo32hqhyuyzz0myziyad3.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%2Fo32hqhyuyzz0myziyad3.png" alt="Navigate to the USA OU" width="580" height="536"&gt;&lt;/a&gt;&lt;br&gt;
Name the new GPO UsaOUPolicy.&lt;br&gt;
Click OK&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep01bsnjvin2v58f2lf6.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%2Fep01bsnjvin2v58f2lf6.png" alt="new GPO UsaOUPolicy" width="745" height="451"&gt;&lt;/a&gt;&lt;br&gt;
Right-click UsaOUPolicy and select Edit.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6iu7gzdu0aodrqzc5dz9.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%2F6iu7gzdu0aodrqzc5dz9.png" alt=" " width="354" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Browse to Computer Configuration\Policies\Windows Settings\Security Settings\Advanced Audit Policy Configuration\Audit Policies\Account Management.&lt;br&gt;
Select and double-click Audit User account management.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuw4c7cdof4ckz82vdpe4.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%2Fuw4c7cdof4ckz82vdpe4.png" alt=" " width="785" height="696"&gt;&lt;/a&gt;&lt;br&gt;
Click the Configure the following audit events check box.&lt;br&gt;
Select the Success and Failure values and click OK.&lt;br&gt;
Close the Group Policy Management Editor&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcupie0m8ahm7uahgkf8o.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%2Fcupie0m8ahm7uahgkf8o.png" alt="Select the Success and Failure" width="434" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deny Log &lt;span id="Deny"&gt;On As a Service
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;In this task, I will configure the Deny Log On As A Service security option.&lt;br&gt;
In the search bar of your Windows Server, Type &lt;strong&gt;Group Policy management&lt;/strong&gt;. You will see a pop-up; click on  Group Policy management.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qnrghhh629p9pxfbv46.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%2F6qnrghhh629p9pxfbv46.png" alt="Group Policy management" width="800" height="601"&gt;&lt;/a&gt;&lt;br&gt;
Browse to the USA OU and right-click UsaOUPolicy. Select Edit.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6iu7gzdu0aodrqzc5dz9.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%2F6iu7gzdu0aodrqzc5dz9.png" alt=" " width="354" height="509"&gt;&lt;/a&gt;&lt;br&gt;
Browse to Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\User Rights Assignment.&lt;br&gt;
Select and double-click the Deny Log on as a service policy.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mszfyced3nwjlasxj8w.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%2F4mszfyced3nwjlasxj8w.png" alt="Deny Log on as a service policy" width="800" height="478"&gt;&lt;/a&gt;&lt;br&gt;
Select the Define this policy setting.&lt;br&gt;
Click Add User or Group.&lt;br&gt;
Click Browse, click Advanced, &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2gkz8eil0otrg1fym23a.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%2F2gkz8eil0otrg1fym23a.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;br&gt;
and then click Find now.&lt;br&gt;
Select IT Admin group.&lt;br&gt;
Click OK &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsehz3wuv91szn14v8y7f.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%2Fsehz3wuv91szn14v8y7f.png" alt="IT Admin group" width="512" height="593"&gt;&lt;/a&gt;&lt;br&gt;
Keep clicking on OK until dialogue boxes are closed (it may require four or five acknowledgements).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qokvm6avj4m6ndz0e1w.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%2F7qokvm6avj4m6ndz0e1w.png" alt="Keep clicking on OK until dialogue boxes are closed" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks for reading till the end&lt;/em&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>beginners</category>
      <category>workplace</category>
      <category>career</category>
    </item>
    <item>
      <title>Active Directory Domain Services (Part 1)</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Wed, 16 Apr 2025 19:34:19 +0000</pubDate>
      <link>https://dev.to/izuabueke/active-directory-domain-services-part-1-4jj9</link>
      <guid>https://dev.to/izuabueke/active-directory-domain-services-part-1-4jj9</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt; 
&lt;li&gt; Active Directory Domain Services &lt;/li&gt;
&lt;li&gt; Installing VMware Pro &lt;/li&gt;
&lt;li&gt; Windows server ISO download &lt;/li&gt;
&lt;li&gt; Creating New Virtual Machine inside VMware &lt;/li&gt;
&lt;li&gt; Installing Active Directory  &lt;/li&gt;
&lt;/ul&gt;
 

&lt;h2&gt;
  
  
  Active &lt;span id="Active"&gt; Directory Domain Services
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;Active Directory Domain Services is the backbone of a Windows-based network; it's a powerful tool for managing and securing a networked environment. It simplifies the administration of users, computers, and other resources while ensuring everything runs smoothly and providing robust security features to protect sensitive data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing VMware Pro
&lt;/h2&gt;

&lt;p&gt;VMware&lt;span id="VMware"&gt; Workstation Pro (VMware Pro) is powerful virtualization software. It allows users to create, manage, and run multiple virtual machines (VMs) on a single physical machine. Each virtual machine operates as if it were a separate, independent computer with its own operating system (OS), applications, and resources.&lt;br&gt;
&lt;strong&gt;Step by step installation of VMware Pro&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the link below
&lt;a href="https://knowledge.broadcom.com/external/article?articleNumber=368667" rel="noopener noreferrer"&gt;https://knowledge.broadcom.com/external/article?articleNumber=368667&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Scroll down to Resolution
&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%2Fxkm58uk26gapjdmwcces.png" alt="scroll down to Resolution" width="800" height="345"&gt; 
after clicking on the link follow the instruction for the registration &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Windows &lt;span id="ISO"&gt; server ISO download
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is an ISO file?&lt;/strong&gt;&lt;br&gt;
An ISO file is a type of disk image file that replicates the contents of a physical CD, DVD, or Blu-ray disc. It contains everything from the operating system files to installation scripts, tools, and other necessary components. You can use this file to create a bootable USB drive, burn it onto a DVD, or mount it directly in virtual machines like VMware Workstation Pro or Hyper-V.&lt;/p&gt;

&lt;p&gt;Steps to download the ISO file.&lt;br&gt;
You can download it by clicking on the link below&lt;br&gt;
&lt;a href="https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022" rel="noopener noreferrer"&gt;https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022&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%2Fo9k14kv47acacb6ztxh3.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%2Fo9k14kv47acacb6ztxh3.png" alt="download the ISO file" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another way is by searching Windows Server 2022 on your Chrome browser and click on the first link&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hz9jtdwth4zcgo0edlb.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%2F8hz9jtdwth4zcgo0edlb.png" alt="searching Windows Server 2022" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the next page, click on download the ISO&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqt8evz5i7dx644nyyr6.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%2Ftqt8evz5i7dx644nyyr6.png" alt="click on download the ISO" width="800" height="320"&gt;&lt;/a&gt;&lt;br&gt;
It will take you to the next page, where you will register by filling out the form and clicking on Download. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyidq9jtoapepchx8yb3y.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%2Fyidq9jtoapepchx8yb3y.png" alt="filling out the form" width="800" height="622"&gt;&lt;/a&gt;&lt;br&gt;
Finally, click on ISO downloads&lt;br&gt;
64-bit edition, download and finish the installation. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j8o7xfxiisvw30p9xld.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%2F4j8o7xfxiisvw30p9xld.png" alt="click on ISO downloads&amp;lt;br&amp;gt;
64-bit edition" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a &lt;span id="Machine"&gt; New Virtual Machine inside VMware
&lt;/span&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;On your device, you will see VMware. Double-click on it, or click on the search bar and search for VMware and open it
&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%2F4iyuv01d5kncfd6rrtbh.png" alt="Open VMware" width="718" height="1080"&gt;
&lt;/li&gt;
&lt;li&gt;When it opens, you will see create a new virtual machine Click on it and select Typical and click next 
&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%2F213e9hr3540kltle6xlu.png" alt="create a new virtual machine" width="800" height="436"&gt;
&lt;/li&gt;
&lt;li&gt;On the next page, select the installer disc image file and click on browse
&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%2F1guc0y4jm96lwfg8uscc.png" alt="disc image file" width="659" height="654"&gt;
.4  This time, it will take the location where you downloaded your ISO file. If not, move to the directory, select the file, and click next to open it. 
&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%2F3hyou2e7z0j5uscsh70v.png" alt="select the file" width="800" height="608"&gt;
&lt;/li&gt;
&lt;li&gt;At this point, you have to choose the version of Windows Server you want to install, which is Windows Server 2022 Datacenter, then fill in your name and password and click on next and next.
&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%2F8exscr8rqpec5kjgcyye.png" alt="choose the version of Windows" width="657" height="644"&gt;
&lt;/li&gt;
&lt;li&gt;On this page, you will choose the disc size you want depending on your device capacity, then select Split Virtual Disc, click on next and click finish
&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%2Faadfqmqcbkwkompiari2.png" alt="choose the disc size" width="647" height="638"&gt;
&lt;/li&gt;
&lt;li&gt;The next thing you will see is an error message that says, "Windows can not find the Microsoft Software License Terms. Make sure the installation sources are valid and restart the installation." Click OK and shut down by right-clicking on the Windows Server 2022 at the top left; you will see a drop-down. Go to Power, then Shut Down Guest.&lt;/li&gt;
&lt;li&gt;the next Click Edit Virtual Machine setting Go to the floppy drive, uncheck Connect at power on, then select OK and power the machine on. &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%2Ftknfz48stullzvcqxt9c.png" alt="Edit Virtual Machine setting" width="800" height="494"&gt;
&lt;/li&gt;
&lt;li&gt;When you power the machine on Click next 
&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%2Fc76dobpi92rkwguwmr59.png" alt="Click next" width="800" height="517"&gt; 
Next install now
&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%2Fo6skto0sc5fsf0lx3nyc.png" alt="install now" width="800" height="607"&gt;
Choose the operating system you want to install.
&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%2Fop1n00d9184xa4i34qo5.png" alt="Choose operating system" width="800" height="593"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Select next accept the term and select next &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozlihst4m8e0mjm0ayme.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%2Fozlihst4m8e0mjm0ayme.png" alt="accept the term" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
Custom: Install Microsoft Server Operating System only and select next on the new page, select next and allow it to install&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcq8rkueaje0viad8lqmj.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%2Fcq8rkueaje0viad8lqmj.png" alt="Custom" width="800" height="606"&gt;&lt;/a&gt;&lt;br&gt;
At this point after you are done with the installation and restart the server, create your password and select finish &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%2Fwsasosz9p37fd0akglxv.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%2Fwsasosz9p37fd0akglxv.png" alt="create password" width="800" height="605"&gt;&lt;/a&gt;&lt;br&gt;
it will now show you new system where you will login as administrator with the password you created&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi38nyils267swteos2t.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%2Fyi38nyils267swteos2t.png" alt="log in as administrator" width="800" height="444"&gt;&lt;/a&gt;&lt;br&gt;
On this page, make sure you allow your PC to be discoverable by other PCs and devices on this network by selecting Yes.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxdqlmib1ws02oqqrb8k.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%2Fhxdqlmib1ws02oqqrb8k.png" alt="allow your PC" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing &lt;span id="Active Directory"&gt; Active Directory
&lt;/span&gt;
&lt;/h2&gt;

&lt;p&gt;To install Active Directory, go to Manager at the top right side, click it, and select Add Roles and Features.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme4q5k8cv95liuo7ubia.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%2Fme4q5k8cv95liuo7ubia.png" alt="install Active Directory" width="800" height="153"&gt;&lt;/a&gt;&lt;br&gt;
On the next page, from before you begin to server selection, click next&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%2Furqjuq90fs9n5ypais5z.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%2Furqjuq90fs9n5ypais5z.png" alt="before you begin" width="787" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;when you get to server Roles, check Active Directory Domain Services, then click add features&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20hbhy7mpfpy3pfv9mgi.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%2F20hbhy7mpfpy3pfv9mgi.png" alt="check Active Directory Domain Services" width="800" height="438"&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%2F61bt8z4qm8ob3szjn9w5.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%2F61bt8z4qm8ob3szjn9w5.png" alt="Server Roles" width="767" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the features, make sure that Group Policy Management is selected. On AD DS select next then on Confirmation click install and wait for the installation to finish&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyn6tr0yo3t6vneu3xt9.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%2Fjyn6tr0yo3t6vneu3xt9.png" alt="features" width="787" height="563"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;After installation promote to domain controller&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzua0dda6chrdl4354al6.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%2Fzua0dda6chrdl4354al6.png" alt="promote to domain controller" width="790" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment Configuration&lt;/strong&gt;&lt;br&gt;
In this configuration, we will add a new forest. on the root domain name add your preferred domain name make sure you add suffix (eg .local, .com etc) if you did not add the suffix, you will get an error&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6u38j0a8pdfr4yopynv.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%2Ff6u38j0a8pdfr4yopynv.png" alt="add a new forest" width="756" height="559"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain Controller Options&lt;/strong&gt;&lt;br&gt;
on this page create a password and click next&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foivzzpl079u1nebbbtel.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%2Foivzzpl079u1nebbbtel.png" alt="Domain Controller Options" width="760" height="555"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;DNS Options&lt;/strong&gt;&lt;br&gt;
on the DNS Options select next&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqazn422bm48wyh814oc.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%2Faqazn422bm48wyh814oc.png" alt="DNS Options" width="755" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Additional options, Paths, Review option select next when you get to Prerequisites Check select install.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uwkbnjtatv9s6g8aamf.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%2F9uwkbnjtatv9s6g8aamf.png" alt="Prerequisites Check" width="768" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the installation, you will see a pop-up; close it. When you close it, the system will restart, and then you will have to sign in with your administrative password.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb5bxfs8l26wmxkc0prv.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%2Fwb5bxfs8l26wmxkc0prv.png" alt="sign in" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where I will stop on part 1. In part 2, I will continue from organization units (OUs) and others, but note: I used Windows Server 2022, but you can use the latest version. For virtualization, I used VMware; you can use your preferred one.&lt;br&gt;
I will appreciate it if you can leave a comment and a like.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>architecture</category>
      <category>workplace</category>
      <category>security</category>
    </item>
    <item>
      <title>Let's dive into AWS, and understand the concepts of EC2, and create an instance to deploy our first application</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Thu, 12 Dec 2024 10:32:36 +0000</pubDate>
      <link>https://dev.to/izuabueke/lets-dive-into-aws-and-understand-the-concepts-of-ec2-and-create-an-instance-to-deploy-our-first-bdl</link>
      <guid>https://dev.to/izuabueke/lets-dive-into-aws-and-understand-the-concepts-of-ec2-and-create-an-instance-to-deploy-our-first-bdl</guid>
      <description>&lt;h2&gt;
  
  
  WHAT IS EC2?
&lt;/h2&gt;

&lt;p&gt;EC2 (Elastic Cloud Compute) is one of the most widely used and one of the most popular services that AWS provides. It allows users to rent virtual computers on which to run their own computer applications; it is elastic in nature, and because of that, it allows scalable deployment of applications by providing flexible and on-demand computing capacity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EC2 instance types and their primary use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;General Purpose:&lt;/strong&gt; These instances offer a balanced mix of compute, memory, and networking resources, making them suitable for a wide range of applications, such as web servers and databases. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;M4, M5, M5n, M5zn, M6a, M6g, and M6i&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Compute Optimized:&lt;/strong&gt; These instances are designed for workloads that require high-performance processing, such as batch processing, scientific simulations, and high-traffic web servers. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C4, C5, C5n, C5a, C6a, C6g, and C7g&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Memory Optimized:&lt;/strong&gt; These instances are ideal for workloads that require large amounts of memory, such as databases, data analytics, and caching. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;R4, R5, R5b, R5n, X1, X1e, and z1d&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Storage Optimized:&lt;/strong&gt; These instances are designed for workloads that require high-performance storage, such as databases, data warehouses, and file systems. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I3, I3en, D2, and H1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Accelerated Computing:&lt;/strong&gt; These instances use hardware accelerators, such as GPUs, FPGAs, or ASICs, to accelerate specific workloads, such as machine learning, scientific simulations, and data analytics. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;P2, P3, P4, G4, F1, and Inf1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some key features of EC2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Machines:&lt;/strong&gt; EC2 provides virtual machines, known as instances, which can be used to run applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; EC2 allows users to scale up or down to handle changes in workload or traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; EC2 provides a range of instance types, including different sizes, types, and configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-demand:&lt;/strong&gt; EC2 provides on-demand computing capacity, allowing users to quickly deploy and terminate instances as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; EC2 provides a secure environment for running applications, with features such as firewall rules, access controls, and encryption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; EC2 integrates with other AWS services, such as S3, RDS, and VPC, to provide a comprehensive cloud computing platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;EC2 instances use case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web servers:&lt;/strong&gt; Running web servers, such as Apache or Nginx.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases:&lt;/strong&gt; Running databases, such as MySQL or PostgreSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application servers:&lt;/strong&gt; Running application servers, such as Tomcat or JBoss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch processing:&lt;/strong&gt; Running batch processing jobs, such as data processing or scientific simulations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine learning:&lt;/strong&gt; Running machine learning workloads, such as training models or making predictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step-by-step guide to creating and deploying application&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Log into the browser and search for AWS Console.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create your account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Log into the account after the creation. You will see something like the environment below. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mrcsflc55jzreasaer3.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%2F2mrcsflc55jzreasaer3.png" alt="environment" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;in the search box, search for EC2 and select Virtual Servers in the Cloud. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F864mfx5jcnmkzhm8x89i.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%2F864mfx5jcnmkzhm8x89i.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To create an instance, you will see &lt;strong&gt;Launch instance&lt;/strong&gt; at the top right side or scroll down, You will see Launch instance, then click on it.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flewdy0w0hnbqr3msavzf.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%2Flewdy0w0hnbqr3msavzf.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;click the box and give your instance a name e.g my "project"&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqub6dxfj5604gaui72k.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%2Frqub6dxfj5604gaui72k.png" alt=" " width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;click the &lt;strong&gt;Add additional tags&lt;/strong&gt; button to add a tag to the instance. Tags are important and a good practice for identification. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3l5rbyxqay9kpulqseu.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%2Fo3l5rbyxqay9kpulqseu.png" alt=" " width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;below is the display of the tag box information &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4g6e6jp47jkua35p6z0.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%2Fz4g6e6jp47jkua35p6z0.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;on the top right side you will see &lt;strong&gt;Stockholm&lt;/strong&gt; click on it and choose Region. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatvdaln2i1f3vvvecgd7.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%2Fatvdaln2i1f3vvvecgd7.png" alt=" " width="800" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Why choose Region and availability zones  The  choice of region is important because of these&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Company/government policy: the company may have a restriction that they don't want to put their data outside their country or zone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Latency: Latency is the time it takes for the request to reach an application and for the application and server to send a response back to you, if there is a delay that means there is high Latency,  if there is no delay it means there is low Latency. For low Latency, creating your instance in the nearest availability zone is recommended. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Availability zone: to avoid downtime it is recommended to put your application in two availability zones so that if one is down the other will be working.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the Application or OS image region to select the type of Image suitable for your operation &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%2F17w46ajpttl72snlwup2.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%2F17w46ajpttl72snlwup2.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the kind of Instance that won't cost so much&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%2Fm6ll99safg5c7wa1i067.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%2Fm6ll99safg5c7wa1i067.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Key Value Pair by clicking on create and provide a name&lt;/strong&gt;
Note: The key-value pair or key pair is the most important thing and this key pair is the one that helps us to log into the instance, by default when you create an instance AWS does not provide your password, the password authentication to the instance is disabled by default the only way you can log into the instance is using key-value pair,  what is key-value pair,  it is the combination of the public-private key which you used to log into a specific instance, so the instance has a public key you will have the private key, using the private key you will log into the instance. 
&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%2Fds39fgebrupcinzx9y4l.png" alt=" " width="800" height="183"&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%2F15iwefo72w9u1rzjdcs6.png" alt=" " width="800" height="591"&gt;
&lt;/li&gt;
&lt;li&gt;On the Network Security, Select Allow HTTP from the internet 
&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%2Fr9ildyapquzts0kijb7u.png" alt=" " width="800" height="500"&gt;
&lt;/li&gt;
&lt;li&gt;On the Configure Storage, you can increase the memory.
&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%2F00d2622ebyj7ht4l75c8.png" alt=" " width="800" height="345"&gt;
&lt;/li&gt;
&lt;li&gt;Click the Launch icon.
&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%2F5nxrhooav3ydndn9wkia.png" alt=" " width="509" height="613"&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It has successfully launched.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0f93piq2exymbf20ci6.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%2Fp0f93piq2exymbf20ci6.png" alt=" " width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on RDP Client Icon. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flopa7hcgwrkvtyymm7no.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%2Flopa7hcgwrkvtyymm7no.png" alt=" " width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Download Remote Desktop file.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqrrtry8ylpyw2f3iaz7.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%2Fnqrrtry8ylpyw2f3iaz7.png" alt=" " width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the Desktop file to open it up. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpogxnk2impzdqkkw05r.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%2Fvpogxnk2impzdqkkw05r.png" alt=" " width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the Get password.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frp10epn2vj00gpwgaluj.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%2Frp10epn2vj00gpwgaluj.png" alt=" " width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on upload a private key file.&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%2Fzjznmx4qeqoo3bh5wpnb.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%2Fzjznmx4qeqoo3bh5wpnb.png" alt=" " width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on the Key Pair Downloaded and Open.
&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%2Fd2x6ktu6sn7fdgo3hd17.png" alt=" " width="800" height="786"&gt;
&lt;/li&gt;
&lt;li&gt;After the Download of the Key Pair, Decrypt the Password.
&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%2Fiew5ibzu2uj222m0gdvr.png" alt=" " width="800" height="340"&gt;
&lt;/li&gt;
&lt;li&gt;The Password after being Decrypt. Copy it, and Go to RDP File that has been downloaded to connect the EC2 Instance.
&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%2Fbtjpz4451sdchv9qd676.png" alt=" " width="800" height="521"&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%2Fouuz6s8er87c72ncj0xd.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%2Fouuz6s8er87c72ncj0xd.png" alt=" " width="800" height="443"&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%2Fgl4a735je0m9nqaj6ps5.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%2Fgl4a735je0m9nqaj6ps5.png" alt=" " width="677" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is your instance environment.
&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%2Ft99k9e04gqpyjaiqxyah.jpg" alt=" " width="800" height="414"&gt; &lt;/li&gt;
&lt;li&gt;on the search bar search for PowerShell in the EC2 instance environment, and run it as an Administrator. 
&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%2Fggagdovzbvbrv96arrxh.jpg" alt=" " width="800" height="477"&gt;
&lt;/li&gt;
&lt;li&gt;On the PowerShell terminal install IIS webserver by running install-WindowsFeature -Name Web-Server -IncloudeManagementTools 
&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%2Fymts21ve7161n4ggpssq.jpg" alt=" " width="800" height="444"&gt;
&lt;/li&gt;
&lt;li&gt;Return to the instance you created copy your Public IP address and paste it into Browser.
&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%2F0vya3pzjmvfd5s3d44rb.png" alt=" " width="800" height="346"&gt;
&lt;/li&gt;
&lt;li&gt;The environment of the Browser.&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%2Ftwv26wcy6131c00dphnh.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%2Ftwv26wcy6131c00dphnh.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
By completing the steps in this guide, you have successfully set up a Windows EC2 instance on Amazon Web Services (AWS) and installed the Internet Information Services (IIS) web server. This accomplishment showcases the versatility and capabilities of AWS, providing a solid groundwork for hosting web applications in a cloud environment. With your IIS server now operational, you can proceed to customize configurations, deploy websites, and scale your instance as needed to accommodate increasing demands &lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudcomputing</category>
      <category>devops</category>
      <category>career</category>
    </item>
    <item>
      <title>Create a Linux VM Work on the IP &amp; Connect</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Tue, 15 Oct 2024 16:42:50 +0000</pubDate>
      <link>https://dev.to/izuabueke/create-a-linux-vm-work-on-the-ip-connect-38a4</link>
      <guid>https://dev.to/izuabueke/create-a-linux-vm-work-on-the-ip-connect-38a4</guid>
      <description>&lt;p&gt;Setting up a virtual machine (VM) in the cloud is an important skill for system administrators, developers, and anyone looking to manage applications in a scalable and flexible environment. In this guide, I will walk you through the process of creating a virtual machine(VM) on Linux, dissociating the IP address, associating the IP Address, and also installing Node.js on the VM after connecting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Guide to Creating a Virtual Machine on (VM)  Linux
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Search for Virtual Machine and select it.
&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%2Flcl2n7vua90br6z930i0.png" alt=" " width="720" height="774"&gt;
&lt;/li&gt;
&lt;li&gt;Create a new virtual machine (VM).
Note when you click the create button choose the virtual machine hosted by Azure 
&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%2Fcy28u64ib0tr0ktnk3m6.png" alt=" " width="800" height="455"&gt;
&lt;/li&gt;
&lt;li&gt;Create a resource group, a resource group container that holds our virtual machine.
&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%2Fkpwuyvzvqh3dbipzxek5.png" alt=" " width="800" height="506"&gt;
&lt;/li&gt;
&lt;li&gt;let's give our VM the name of mylinux, you can select a Region or use the default.
&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%2Fpbd0td52izqnv721qsss.png" alt=" " width="800" height="519"&gt;
&lt;/li&gt;
&lt;li&gt;choose an Image. &lt;strong&gt;Note&lt;/strong&gt; The image is important because it is what defines the type of VM we are creating, so we will choose Ubuntu Server 24.04 LTS 
&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%2F0ika9uprk79a1rhnz8sd.png" alt=" " width="800" height="443"&gt;
&lt;/li&gt;
&lt;li&gt;Create an Administrator Account. There are  two types of accounts, account with SSH public key and account Password, we will Use account Password and use Azureuser for the username and Password1234 for the password. 
&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%2Fu7k60t40r0313a7z3ewm.png" alt=" " width="800" height="612"&gt;
&lt;/li&gt;
&lt;li&gt;Select Inbound Port Rules. Select SSH and 
HTTP (80), with SSH you will connect a Linux VM through window powershell or command line interface (CLI), but with HTTP you will access it through the browser.
&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%2Fqsacfzeuwchf45rpk3dy.png" alt=" " width="800" height="334"&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then select Review + Create. if there is no omission or error it will show Validation passed&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1554ib0qiy86xdbmodvs.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%2F1554ib0qiy86xdbmodvs.png" alt=" " width="800" height="694"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then select Create.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgo5dux9q417pdyrstjjt.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%2Fgo5dux9q417pdyrstjjt.png" alt=" " width="800" height="666"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step-by-step guide to dissociating the IP address and associating the IP Address.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selete go to resource to access your virtual machine (VM)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uj8cahtt9dalxc1bz47.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%2F8uj8cahtt9dalxc1bz47.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;this is your virtual machine and IP address&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp15q53oqxhsc94290p2.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%2Fkp15q53oqxhsc94290p2.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Before we start dissociating the IP address and associating the IP Address back Note that when dissociating a dynamic IP address it will go back to the Azure IP pool and the risk is that when you want to associate it back you will not be assigning the same IP address so it will result in creating new IP, then you will lose the configurations on your virtual machine. So The first thing you will do is to make sure that your IP is a static IP address.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search and click on public IP address&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6143692u867fxauc0f8f.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%2F6143692u867fxauc0f8f.png" alt=" " width="598" height="716"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your IP address&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcelk7bfuvpx4at2w1us.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%2Fdcelk7bfuvpx4at2w1us.png" alt=" " width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;locate dissociate click and confirm it &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ux0vib5ub9edokbb20m.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%2F2ux0vib5ub9edokbb20m.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;locate associate click on it Resource type select the network interface on the network interface select your IP and confirm it&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslhgutup06o0poctb1j5.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%2Fslhgutup06o0poctb1j5.png" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Connect to the Linux Virtual machine&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On your virtual machine (VM) locate and copy your public IP address
&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%2Fmw2y12epsw4ums26ym52.png" alt=" " width="800" height="331"&gt;
&lt;/li&gt;
&lt;li&gt;Open PowerShell on your system and type ssh username@IP click enter to connect your VM&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%2Ffaa3sjt4qym08h86fmye.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%2Ffaa3sjt4qym08h86fmye.png" alt=" " width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;go to your VM locate your public IP click on it and expand the Idle timeout to 30 so that you will not be timedout and save changes
&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%2Fqybiz8gt4u1b6f10kc05.png" alt=" " width="800" height="205"&gt;
&lt;/li&gt;
&lt;li&gt;On your PowerShell, you will be asked if you are sure you want 
continue to connecting Enter yes and then your password (password will not be visible while typing in Linux).
&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%2Fvfk4v1p81gl9s1pfq1vq.png" alt=" " width="800" height="204"&gt;
&lt;/li&gt;
&lt;li&gt;Change your directory to root using the command - sudo su.
&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%2F70pw9owga044eh9wh2tr.png" alt=" " width="800" height="420"&gt;
&lt;/li&gt;
&lt;li&gt; Run the following commands to ensure the package list is up-to-date: sudo apt update
&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%2Fj95pe6b9yotxm65r20y7.png" alt=" " width="800" height="420"&gt;
&lt;strong&gt;Install Node.js on a Linux Server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Type the command sudo apt install apt nodejs npm after some update you will be asked do you want to continue enter yes(y)
&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%2F97sag5p7my7kvegcdi5w.png" alt=" " width="800" height="420"&gt;
&lt;/li&gt;
&lt;li&gt;Congratulations you have installed Node.js, to Verify the installation: type node -v
npm -v&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%2Fmpj06665a7zj6r8x5e0u.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%2Fmpj06665a7zj6r8x5e0u.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By following these steps, you’ve successfully created a Linux VM in Azure, dissociated the IP address, associated the IP Address, and installed Node.js. This setup is ready for hosting web apps, APIs, microservices, real-time applications, and more. You can integrate it with Azure’s ecosystem of services for databases, networking, storage, and monitoring while enjoying the flexibility of scaling your solution as needed.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>linux</category>
      <category>virtualmachine</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Provide storage for the public website</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Mon, 30 Sep 2024 12:47:10 +0000</pubDate>
      <link>https://dev.to/izuabueke/provide-storage-for-the-public-website-289j</link>
      <guid>https://dev.to/izuabueke/provide-storage-for-the-public-website-289j</guid>
      <description>&lt;h2&gt;
  
  
  What do we mean by public storage
&lt;/h2&gt;

&lt;p&gt;Let us first understand what storage is: it is a container where data are stored and controlled, the data can be structured, unstructured, or semi-structured and the data can be either public or private. &lt;br&gt;
When storage is public it means that anyone can access the data in it without needing permission, requiring customers to login or being restricted&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The aim&lt;/strong&gt; is for anyone who has access to the website or clicks on the URL can view all the data on the website without restriction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a storage account with high availability.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;LET ME SHOW YOU STEP BY STEP&lt;/strong&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a storage account to support the public website.&lt;/li&gt;
&lt;li&gt;In the portal, search for and select Storage accounts.&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%2Fh1dj5i89r53vfs8j8m5j.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%2Fh1dj5i89r53vfs8j8m5j.png" alt="search for and select Storage accounts" width="712" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select + Create.&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%2Fny3ht5ftdub9gn97mfnv.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%2Fny3ht5ftdub9gn97mfnv.png" alt="Select + Create" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For resource group select new. Give your resource group a name and select OK 
&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%2Fok9qq19ix2lo2ar5xnaz.png" alt="Give your resource group a name" width="800" height="485"&gt;
&lt;/li&gt;
&lt;li&gt;Set the Storage account name to publicwebsite. Make sure the storage account name is unique by adding an identifier.
&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%2Fa9xrcux29gl71p740wp5.png" alt="Set the Storage account name" width="800" height="435"&gt;
&lt;/li&gt;
&lt;li&gt;Take the defaults for other settings: meaning all other settings should remain the way they are.
-Select Review and then Create.
&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%2Fnzuhu3405g8uvfky4kqe.png" alt="Review and then Create" width="800" height="519"&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the storage account to deploy, and then select Go to resource
2 . This storage requires &lt;strong&gt;&lt;em&gt;high availability&lt;/em&gt;&lt;/strong&gt; if there’s a regional outage. Additionally, enable read access to the secondary region, Learn more about storage account redundancy &lt;/li&gt;
&lt;li&gt;In the storage account, in the Data management section, select the Redundancy blade.
&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%2Fx76jrv4q9dc9x67f0865.png" alt="in the Data management section, select the Redundancy" width="800" height="423"&gt;
&lt;/li&gt;
&lt;li&gt;Ensure Read-access Geo-redundant storage is selected.
&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%2Fawz9ckm9no4wy0gxrunl.png" alt="Ensure Read-access Geo-redundant storage is selected" width="800" height="435"&gt;
&lt;/li&gt;
&lt;li&gt;Review the primary and secondary location information.
&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%2Fqu5xza0419rrsilqgbtq.png" alt="Review the primary and secondary location" width="800" height="423"&gt;
3 . Information on the public website should be accessible without requiring customers to login.&lt;/li&gt;
&lt;li&gt;In the storage account, in the Settings section, select the Configuration blade.
&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%2Fpes1jccqasebokl56k7h.png" alt="in the Settings section, select the Configuration blade." width="800" height="416"&gt; &lt;/li&gt;
&lt;li&gt;Ensure the Allow blob anonymous access setting is Enabled.
&lt;em&gt;The reason for enabling Allow blob anonymous access is to make it accessible to all without restriction and this is what makes the storage public, so if you miss it will no longer be public storage but rather private.&lt;/em&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%2F1uul71uij9kq6hx2hm54.png" alt="Enabled Allow blob anonymous access" width="800" height="478"&gt;
&lt;/li&gt;
&lt;li&gt;Be sure to Save your changes.&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%2Fi7wz49vl6hnx01j2xvd9.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%2Fi7wz49vl6hnx01j2xvd9.png" alt="Save your changes" width="800" height="473"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Create a blob storage container with anonymous read access&lt;/strong&gt;&lt;br&gt;
1 . The public website has various images and documents. Create a blob storage container for the content. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In your storage account, in the Data storage section, select the Containers blade 
&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%2F1otj0wuhq6xm6ea5axus.png" alt="in the Data storage section, select the Containers blade" width="800" height="396"&gt;
-Select + Container. 
&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%2Fi2l0gscbrkl9ucuth4v8.png" alt="Select + Container" width="800" height="485"&gt;
&lt;/li&gt;
&lt;li&gt;Ensure the Name of the container is public 
&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%2F0hp4hrjesx1oauoyx09e.png" alt="Name your container public" width="452" height="736"&gt;
&lt;/li&gt;
&lt;li&gt;Select Create
&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%2Fcdxlodfntyihpovm3zwx.png" alt="Select Create" width="452" height="736"&gt;
2 . Customers should be able to view the images without being authenticated. Configure anonymous read access for the public container blobs.&lt;/li&gt;
&lt;li&gt;Select your public container.
&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%2Fkr7t4uwdt96l6s16q5s9.png" alt="Select your public container" width="800" height="307"&gt;
&lt;/li&gt;
&lt;li&gt;On the Overview blade, select Change access level.
&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%2Fzypnttykk5dhgcl6olea.png" alt="On the Overview blade, select Change access level" width="800" height="307"&gt;
&lt;/li&gt;
&lt;li&gt;Ensure the Public access level is Blob (anonymous read access for blobs only).
&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%2Fvyyx3nbyzva3ii28f4xh.png" alt=" " width="800" height="490"&gt;
Select OK
&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%2F07hay08ws0i8x9223on0.png" alt="Select OK" width="800" height="490"&gt;
&lt;strong&gt;Practice uploading files and testing access.&lt;/strong&gt;
1 . For testing, upload a file to the public container. The type of file doesn’t matter. A small image or text file is a good choice.&lt;/li&gt;
&lt;li&gt;Ensure you are viewing your container
&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%2Fe987j47dmd3slxdajmut.png" alt="Ensure you are viewing your container" width="800" height="304"&gt;
&lt;/li&gt;
&lt;li&gt;Select Upload.
&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%2Fvfd0c37fjq3n04tfyq4q.png" alt="Select Upload" width="800" height="304"&gt;
&lt;/li&gt;
&lt;li&gt;Browse to files and select a file. Browse to a file of your choice. 
&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%2F24486wuptygf0buy9isr.png" alt="Browse to files and select a file. Browse to a file of your" width="800" height="555"&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%2F1iwv6zqtra37fslw9w3e.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%2F1iwv6zqtra37fslw9w3e.png" alt="Browse to files and select a file. Browse to a file of your" width="709" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select Upload.
&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%2Frq8egod43o1j9asdo8aw.png" alt="Select Upload." width="800" height="617"&gt;
&lt;/li&gt;
&lt;li&gt;Close the upload window, Refresh the page and ensure your file was uploaded.
&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%2Fo7682lmpyc77paowuoui.png" alt="Refresh the page and ensure your file was uploaded." width="800" height="367"&gt;
2 . Determine the URL for your uploaded file. Open a browser and test the URL.&lt;/li&gt;
&lt;li&gt;Select your uploaded file
&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%2Fqpqqa4rlxsbl1rt5gnkb.png" alt="Select your uploaded file" width="785" height="838"&gt;
&lt;/li&gt;
&lt;li&gt;On the Overview tab, copy the URL. 
&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%2Fq0vf27uriv8i4qq5iebj.png" alt="copy the URL" width="785" height="838"&gt;
&lt;/li&gt;
&lt;li&gt;Paste the URL into a new browser tab.
&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%2Febbsmbmn7w595yxwwczl.png" alt="Paste the URL into a new browser tab." width="800" height="440"&gt;
&lt;/li&gt;
&lt;li&gt;If you have uploaded an image file it will display in the browser. Other file types should be downloaded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure soft delete&lt;/strong&gt;&lt;br&gt;
1 . It’s important that the website documents can be restored if they’re deleted. Configure blob soft delete for 21 days.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the Overview blade of the storage account.
&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%2Fmpva3xpymaw6jdmwv3g9.png" alt="the Overview blade of the storage account" width="800" height="328"&gt;
&lt;/li&gt;
&lt;li&gt;On the Properties page, locate the Blob service section.
&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%2Fo42rywzxdur5pv1wnca1.png" alt="On the Properties page, locate the Blob service section." width="800" height="418"&gt;
&lt;/li&gt;
&lt;li&gt;Select the Blob soft delete setting.
&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%2Fres4aexlkie5zft1o42p.png" alt="Select the Blob soft delete setting" width="800" height="360"&gt;
&lt;/li&gt;
&lt;li&gt;Ensure the Enable soft delete for blobs is checked.&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%2F8sa42om0v8zs7iyn1p20.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%2F8sa42om0v8zs7iyn1p20.png" alt=" Enable soft delete for blobs is checked" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change the Keep deleted blobs for (in days setting is 21).
&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%2Fsnsyugpakfjdo8jesjjy.png" alt=" Change the Keep deleted blobs for (in days setting is 21)" width="800" height="494"&gt;
&lt;/li&gt;
&lt;li&gt;Notice you can also Enable soft delete for containers.
&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%2Fjokwx1eh8jzl2h99q6zo.png" alt="Enable soft delete for containers" width="800" height="494"&gt;
&lt;/li&gt;
&lt;li&gt;Don’t forget to Save your changes
&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%2Fojkg51av4hq33s8035gj.png" alt="Save your changes" width="800" height="503"&gt;
2 . If something gets deleted, you need to practice using soft delete to restore the files.&lt;/li&gt;
&lt;li&gt;Navigate to your container where you uploaded a file.
&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%2F12i59hryz100kx0xhoiw.png" alt="Navigate to your container where you uploaded a fileImage description" width="800" height="288"&gt;
&lt;/li&gt;
&lt;li&gt;Select the file you uploaded and then select Delete.
&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%2Fquscgztvfq1rlw79xx2m.png" alt="select Delete" width="800" height="329"&gt;
&lt;/li&gt;
&lt;li&gt;Select OK to confirm deleting the file.
&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%2F30o6kvlwl2h6x2vj5s7h.png" alt="Select OK Image description" width="633" height="597"&gt;
&lt;/li&gt;
&lt;li&gt;On the container Overview page, toggle the slider Show deleted blobs. This toggle is to the right of the search box.
&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%2F3m8atm2p6kavzen46dao.png" alt="toggle the slider Show deleted blobs." width="800" height="344"&gt;
&lt;/li&gt;
&lt;li&gt;Select your deleted file, and use the ellipses on the far right, to Undelete the file. 
&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%2Fdw5k9r8xdfueooeompah.png" alt="Undelete the file" width="800" height="295"&gt;
&lt;/li&gt;
&lt;li&gt;Refresh the container and confirm the file has been restored.&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%2F0uu831zrzn47nqq2uxb6.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%2F0uu831zrzn47nqq2uxb6.png" alt="confirm the file has been restored." width="800" height="288"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Configure blob versioning&lt;/strong&gt;&lt;br&gt;
1 . It’s important to keep track of the different website product document versions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the Overview blade of the storage account.
&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%2Fix4hfavjqvxfgq8yirui.png" alt="Go to the Overview blade of the storage account" width="800" height="363"&gt;
&lt;/li&gt;
&lt;li&gt;In the Properties section, locate the Blob service section
&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%2Fjy9713waq37s2tpbgmjr.png" alt="In the Properties section, locate the Blob service section" width="800" height="363"&gt;
&lt;/li&gt;
&lt;li&gt;Select the Versioning setting
&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%2F7zjo7hf672hfyvx9qdib.png" alt="Select the Versioning" width="800" height="363"&gt;
&lt;/li&gt;
&lt;li&gt;Ensure the Enable versioning for blobs checkbox is checked.&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%2Fbblqo7omhcm8foaa2qz1.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%2Fbblqo7omhcm8foaa2qz1.png" alt="Enable versioning" width="769" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notice your options to keep all versions or delete versions after.
&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%2F2z8fmcen47zpvpidl1q0.png" alt=" " width="769" height="616"&gt;
Don’t forget to Save your changes. 
&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%2Fpqfx5ugrqcy8oyvp39r5.png" alt="Save your changes" width="800" height="579"&gt;
2 . As you have time experiment with restoring previous blob versions.&lt;/li&gt;
&lt;li&gt;Upload another version of your container file. This overwrites your existing file.
&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%2Fx4gqvz56tdni3q7ydn3k.png" alt="Upload another version" width="800" height="344"&gt;
&lt;/li&gt;
&lt;li&gt;Your previous file version is listed on Show deleted blobs page.
&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%2Fmwkcyy5hhbfwjclpy3kj.png" alt="Your previous file version is listed on Show deleted blobs " width="800" height="322"&gt;
These are just simple steps on how we achieve the task of creating storage for the public website. 
&lt;strong&gt;&lt;em&gt;Note&lt;/em&gt;&lt;/strong&gt; that what makes any public storage public is &lt;em&gt;enabling blob anonymous access.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>career</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Provide storage for the IT department testing and training</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Fri, 27 Sep 2024 12:50:37 +0000</pubDate>
      <link>https://dev.to/izuabueke/provide-storage-for-the-it-department-testing-and-training-bnb</link>
      <guid>https://dev.to/izuabueke/provide-storage-for-the-it-department-testing-and-training-bnb</guid>
      <description>&lt;h2&gt;
  
  
  What is Azure storage?
&lt;/h2&gt;

&lt;p&gt;Azure Storage, offered by Microsoft Azure, is a cloud storage solution that provides a range of services for storing and controlling data in the cloud. It is compatible with various forms of data, such as structured, unstructured, and semi-structured data, and is built for superior availability, durability, and scalability.&lt;/p&gt;

&lt;p&gt;Below are the essential elements of Azure Storage:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blob Storage&lt;/strong&gt;: Employed to store vast quantities of disorganized data, like pictures, films, and backups. It provides different access tiers to help with managing costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;: Offers completely managed file shares in the cloud, accessible through the SMB (Server Message Block) protocol. This is beneficial for applications requiring shared file storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Queue Storage&lt;/strong&gt;: A service that stores and retrieves messages between application components, enabling asynchronous communication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Table Storage&lt;/strong&gt;: An NoSQL key-value database for partially-structured information, offering quick retrieval and expansion for high-performance storage needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage for Disks&lt;/strong&gt;: Utilized for virtual machine (VM) disks, providing both managed and unmanaged disks for Azure VMs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Azure Data Lake Storage is a dedicated service designed for big data analysis, offering a hierarchical namespace and enhancements for extensive analytics tasks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Azure Storage is connected with various Azure services, allowing users to create applications that can scale and withstand challenges. It provides features such as encryption, redundancy choices, and access control to guarantee data security and compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here are the steps to set up storage for the IT department's testing and training activities:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1. Create a resource group and a storage account.&lt;/strong&gt;&lt;br&gt;
A resource group is a container used to organize and manage related resources in cloud computing environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure portal, search for and select Resource groups.&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%2F046toqmtchfvame0kba2.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%2F046toqmtchfvame0kba2.png" alt="Resource groups" width="779" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select + Create.
&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%2Fe4gcy4f8bzx9dbwm5sur.png" alt="Select + Create." width="800" height="279"&gt;
&lt;/li&gt;
&lt;li&gt;Give your resource group a name. For example, storagerg.&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%2Fnpk8i2i2ygn8u9tjs95t.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%2Fnpk8i2i2ygn8u9tjs95t.png" alt="Resource groups name" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select a region. Use this region throughout the project.
&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%2Fws8zvrtw9j6u6lckpw77.png" alt="Select a region" width="800" height="486"&gt;
&lt;/li&gt;
&lt;li&gt;Select Review and Create to validate the resource group.&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%2Fxw4g10kpdwm260x10fps.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%2Fxw4g10kpdwm260x10fps.png" alt="Review and Create" width="674" height="811"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select Create to deploy the resource group.&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%2F3affxg7bufjhen86lpxt.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%2F3affxg7bufjhen86lpxt.png" alt="Resource groups created" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2. Create and deploy a storage account to support testing and training.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure portal, search for and select Storage accounts.&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%2Fv2p5ei56yhnugwfvfb18.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%2Fv2p5ei56yhnugwfvfb18.png" alt="search for and select Storage accounts" width="782" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select + Create.&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%2Fhhzaymjfxgjjw6zym415.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%2Fhhzaymjfxgjjw6zym415.png" alt="Select + Create" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Basics tab, select your Resource groups 
&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%2Ftx9ph67j2tcb9dvwrug0.png" alt="select your Resource groups" width="800" height="310"&gt;
&lt;/li&gt;
&lt;li&gt;Provide a Storage account name. The storage account name must be unique in Azure.&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%2F9mz8p8f0ddpnzwkd6md5.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%2F9mz8p8f0ddpnzwkd6md5.png" alt="Storage account name." width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the Performance to Standard.&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%2Fhv8oxzmkux0vp9yxecaz.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%2Fhv8oxzmkux0vp9yxecaz.png" alt="Performance" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select Review, and then Create.&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%2Fttf7j4kgz98r1qu5eje3.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%2Fttf7j4kgz98r1qu5eje3.png" alt=" Review, and then Create" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wait for the storage account to deploy and then Go to the resource. 
&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%2Fwobfqzk543fwhe7b86fe.png" alt=" " width="800" height="410"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configure simple settings in the storage account.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1 The data in this storage account doesn’t require high availability or durability. A lowest cost storage solution is desired.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In your storage account, in the Data management section, select the Redundancy blade.
&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%2F3gacafe77dflzzz93fyb.png" alt="Redundancy " width="800" height="293"&gt;
&lt;/li&gt;
&lt;li&gt;Select Locally-redundant storage (LRS) in the Redundancy drop-down.
&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%2Fq1rzs7mbtxeortspf8b9.png" alt="Select Locally-redundant storage (LRS)" width="800" height="266"&gt;
&lt;/li&gt;
&lt;li&gt;Be sure to Save your changes.
&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%2F937s30cyobcb7yyv484m.png" alt="changes saved" width="800" height="369"&gt;
&lt;/li&gt;
&lt;li&gt;Refresh the page and notice the content only exists in the primary location.
&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%2Fluk913qzckpm2uk8uhas.png" alt="location primary only." width="800" height="410"&gt;
&lt;strong&gt;Step2. The storage account should only accept requests from secure connections.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the Settings section, select the Configuration blade.&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%2Fo2mitn8dwxwu22ozjpnl.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%2Fo2mitn8dwxwu22ozjpnl.png" alt="select the Configuration" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure the Secure transfer required is Enabled.&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%2Fkgbv3703whytl5x4n8gp.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%2Fkgbv3703whytl5x4n8gp.png" alt="Secure transfer Enabled." width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step3. Developers would like the storage account to use at least TLS version 1.2.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Settings section, select the Configuration blade.&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%2Fzgtnipntft28n79li3d7.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%2Fzgtnipntft28n79li3d7.png" alt="select the Configuration" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure the Minimal TLS version is set to Version 1.2
&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%2F7ko2bkkziaocapt1ku9z.png" alt="Minimal TLS Version 1.2 Enabled" width="800" height="407"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4. Until the storage is needed again, disable requests to the storage account. Learn more about disabling shared keys.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Settings section, select the Configuration blade&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%2F4hlpzhze1iadi562508x.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%2F4hlpzhze1iadi562508x.png" alt="select the Configuration" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure Allow storage account key access is Disabled. 
&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%2Fu571jihlubirxlbwztky.png" alt="Disabled Allow storage account key access" width="800" height="332"&gt;
&lt;/li&gt;
&lt;li&gt;Be sure to Save your changes. &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%2F9nlmysb7tzi25sxuvcbm.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%2F9nlmysb7tzi25sxuvcbm.png" alt="Save your changes" width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Setting up Azure Storage for the IT department's testing and training needs provides a secure, scalable, and cost-effective environment that supports learning and development activities in a real-world cloud context. Through this guide, we've walked through the essential steps to configure a customized storage solution using Microsoft Azure — from creating a resource group to deploying and securing a storage account with tailored settings.&lt;/p&gt;

&lt;p&gt;By selecting Locally Redundant Storage (LRS) , we ensured minimal costs while maintaining sufficient durability for non-production use. Enforcing secure transfer and setting the minimum TLS version to 1.2 helped align the configuration with modern security standards. Disabling shared key access added an extra layer of control, allowing the team to manage access effectively and disable it when the storage is not in use.&lt;/p&gt;

&lt;p&gt;This setup not only meets the immediate requirements of the IT department but also serves as a practical learning tool for understanding Azure’s cloud capabilities, making it highly relevant for professionals aiming to grow in #devops, #cloud, and broader #career paths. It reinforces best practices around resource organization, security, and cost management, all of which are crucial skills in today’s cloud-driven IT landscape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In summary&lt;/strong&gt;, this article demonstrates how to efficiently deploy and configure Azure Storage to support internal training and testing, while also contributing to long-term skill development and operational readiness in cloud environments.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>career</category>
      <category>learning</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Concepts in cloud computing</title>
      <dc:creator>Izuabueke Davidson  Anujulu</dc:creator>
      <pubDate>Wed, 25 Sep 2024 13:15:47 +0000</pubDate>
      <link>https://dev.to/izuabueke/concepts-in-cloud-computing-17a7</link>
      <guid>https://dev.to/izuabueke/concepts-in-cloud-computing-17a7</guid>
      <description>&lt;h2&gt;
  
  
  What is cloud computing?
&lt;/h2&gt;

&lt;p&gt;Cloud computing is a technology that allows users to access and store data, applications, and services online, removing the need for physical servers or personal computers. This makes things more flexible, scalable, and convenient, enabling businesses and individuals to use resources like computing power, storage, and apps whenever needed, without relying on physical hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;On-Demand Access&lt;/strong&gt;: Users can use services when needed without needing assistance from the provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Across Devices&lt;/strong&gt;: Services can be accessed via the Internet on smartphones, tablets, and laptops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Resources&lt;/strong&gt;: Cloud providers distribute resources across multiple users, adjusting them dynamically as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Users can easily increase or decrease their resources depending on their needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-as-You-Go&lt;/strong&gt;: Cloud usage is tracked, and users only pay for the amount of service they use.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Types of Cloud Services:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure as a Service (IaaS)&lt;/strong&gt;: Provides online access to virtual computing resources like storage and networking. Examples include Amazon Web Services (AWS) and Microsoft Azure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Platform as a Service (PaaS)&lt;/strong&gt;: Offers a platform for developers to create, test, and launch applications without managing infrastructure. Examples include Google App Engine and Heroku.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Software as a Service (SaaS)&lt;/strong&gt;: Delivers software applications over the internet, which users can access through their browsers without installing anything. Examples include Gmail, Dropbox, and Salesforce.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Cloud Deployment Models:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Public Cloud&lt;/strong&gt;: Services are provided over the public internet and shared among various organizations, managed by companies like AWS, Microsoft, or Google.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Private Cloud&lt;/strong&gt;: This model is reserved for one organization, offering greater control and security. It can be hosted either internally or by a third party.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid Cloud&lt;/strong&gt;: A combination of public and private clouds, allowing data and applications to move between the two. It allows businesses to keep sensitive data private and use public resources for less critical needs.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Benefits of Cloud Computing:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Efficiency&lt;/strong&gt;: Reduces the need for heavy investment in physical hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Resources can be quickly scaled up or down depending on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt;: Cloud services often include backup and disaster recovery solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility&lt;/strong&gt;: Accessible from any location with an internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Advanced security protocols are often implemented by cloud providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloud computing has revolutionized industries by promoting faster innovation, lowering costs, and allowing businesses to focus more on their core activities rather than managing IT systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Virtualization?
&lt;/h3&gt;

&lt;p&gt;Virtualization is a technology that lets you create virtual versions of physical hardware, like servers, storage, or networks. Instead of one physical machine doing a single job, virtualization allows that machine to run multiple virtual machines (VMs) at once, each with its own operating system and apps, as if they were separate computers.&lt;/p&gt;

&lt;p&gt;A special software called a hypervisor helps split a computer's resources into these independent environments. This way, businesses can get more out of their hardware, save money, and be more flexible, as different tasks or applications can run on the same server without any issues.&lt;/p&gt;

&lt;p&gt;In summary, virtualization turns one physical computer into several "virtual computers," making IT systems more efficient and adaptable. &lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability
&lt;/h3&gt;

&lt;p&gt;Scalability is the ability of a system to expand or contract in response to demand or needs. In a nutshell, it refers to how easily a system—be it an application, network, or company—can handle higher workloads or user counts when necessary or reduce resources when demand drops.&lt;/p&gt;

&lt;p&gt;For example, with cloud computing, the system may handle an unexpected spike in website traffic by adding more servers. When the amount of traffic decreases, it can scale down to require fewer servers. This guarantees that the system runs smoothly and that no resources are wasted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agility
&lt;/h3&gt;

&lt;p&gt;Agility is the capacity to adjust and swiftly change positions as required. In the business world or in the realm of technology, it entails being adaptable and quick to react to changes, such as adapting to fresh customer needs, market shifts, or technological progressions. The key is to make quick decisions, swiftly implement changes, and remain flexible in a dynamic environment.&lt;/p&gt;

&lt;p&gt;For instance, an agile business may quickly modify its plans, tactics, or workflows to meet new demands and stay ahead of the curve.&lt;/p&gt;

&lt;h3&gt;
  
  
  High Availability
&lt;/h3&gt;

&lt;p&gt;high availability is when a system, application, or service is consistently operational, minimizing any potential downtime. It guarantees that in case of an issue such as a server crash or network problem, the system will still function with minimal disruptions. This is frequently achieved by having backups or additional resources prepared to replace any failed components, ensuring seamless operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fault Tolerance
&lt;/h3&gt;

&lt;p&gt;Fault tolerance refers to a system's ability to keep running smoothly even when part of it fails or encounters problems. In other words, if something goes wrong, like a server breaking down or a software error, the system can still function without crashing or losing data. This feature is essential for creating strong and dependable cloud solutions, ensuring consistency and reducing downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Global Reach
&lt;/h3&gt;

&lt;p&gt;This refers to the capability of reaching out to users globally and providing services or applications. By having data centers located in multiple countries and regions, cloud providers allow businesses to easily reach customers no matter their location.&lt;/p&gt;

&lt;p&gt;The main distinction between elasticity and scalability in cloud computing is in their approach to managing resources according to demand.&lt;/p&gt;

&lt;p&gt;1 &lt;strong&gt;Scalability&lt;/strong&gt; is the system's capacity to manage growing workloads through the addition of resources, whether by improving current hardware (vertical scaling) or incorporating additional machines (horizontal scaling). Typically, scalability is carefully orchestrated for the future. It guarantees that the system can expand to accommodate rising demands without facing any performance problems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A business expands gradually and increases the number of servers to accommodate its increasing user population.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2 &lt;strong&gt;Elasticity&lt;/strong&gt; refers to the capacity to adjust resources in response to live demand. It is a process that is more active and self-regulating, occurring in response to changes in workload. The system immediately adapts to fluctuations in demand to prevent resources from being wasted during periods of low demand.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: A sudden increase in web traffic during a sale prompts the e-commerce site to automatically allocate additional resources to manage the higher load. After the sale is over, it decreases in size to cut expenses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In conclusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; involves increasing or decreasing capacity in a strategic manner to accommodate future needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elasticity&lt;/strong&gt; refers to the ability to automatically adapt resources in order to meet sudden shifts in demand.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>cloud</category>
      <category>azure</category>
    </item>
  </channel>
</rss>
