<?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: satriaherman</title>
    <description>The latest articles on DEV Community by satriaherman (@_satria_herman).</description>
    <link>https://dev.to/_satria_herman</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%2F720581%2F8f5c9edc-1ec9-4ad7-a334-38e8fef9b5a6.jpeg</url>
      <title>DEV Community: satriaherman</title>
      <link>https://dev.to/_satria_herman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_satria_herman"/>
    <language>en</language>
    <item>
      <title>Deploy Your Apps with 0 downtime Part 1 (Blue-Green Deployment)</title>
      <dc:creator>satriaherman</dc:creator>
      <pubDate>Thu, 21 May 2026 08:25:54 +0000</pubDate>
      <link>https://dev.to/_satria_herman/deploy-your-apps-with-0-downtime-part-1-blue-green-deployment-4hmh</link>
      <guid>https://dev.to/_satria_herman/deploy-your-apps-with-0-downtime-part-1-blue-green-deployment-4hmh</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Have you ever experienced your app &lt;strong&gt;can't be accessed&lt;/strong&gt; whenever you release a &lt;strong&gt;new version&lt;/strong&gt; of your app?. In this series, we'll explore how to deploy updates with zero downtime, starting with one of the most reliable strategies — &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When we deploy an application on Cloud provider like AWS, Azure or GCP, we usually do like this: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shutting down the app&lt;/li&gt;
&lt;li&gt;compiled new version code&lt;/li&gt;
&lt;li&gt;Start app again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looks like there's no problem with steps above until we noticed that our app is &lt;strong&gt;getting down&lt;/strong&gt; or &lt;strong&gt;can't be accessed&lt;/strong&gt; during the deployment process. we call this situation as &lt;strong&gt;downtime&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article we will learn how to prevent that using a one of deployment strategies called &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is Blue-Green Deployment?
&lt;/h2&gt;

&lt;p&gt;Blue-Green Deployment is a strategy which we will switch the traffic from previous version instances(&lt;strong&gt;blue&lt;/strong&gt;) to another identical new release instances(&lt;strong&gt;green&lt;/strong&gt;) which are running on &lt;strong&gt;production environment&lt;/strong&gt;. To achieve this goal, &lt;strong&gt;load balancer&lt;/strong&gt; is playing crucial function to switching traffic&lt;/p&gt;

&lt;p&gt;In this tutorial, we will use &lt;strong&gt;docker&lt;/strong&gt; as a container manager and nginx as &lt;strong&gt;load balancer&lt;/strong&gt;. We will deploy &lt;strong&gt;nextjs&lt;/strong&gt; app and simulate it to achieve 0 downtime by using &lt;strong&gt;blue green deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we started, make sure you already install software bellow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/wsl/install" rel="noopener noreferrer"&gt;wsl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;: make sure you are familiar with linux environment&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install Docker and Nginx
&lt;/h2&gt;

&lt;p&gt;open wsl and type bellow to install nginx&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;after nginx installed we will install docker,nodejs and git&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker nodejs git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after you installed the tools above, please create directory following image bellow&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%2F08bwz5b327d0z1evd4gv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08bwz5b327d0z1evd4gv.png" alt=" " width="428" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Docker
&lt;/h2&gt;

&lt;p&gt;We will use docker compose to run the app and nginx inside the container. so on Dockerfile, write this code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Before Implement Blue Green Deployment
&lt;/h2&gt;

&lt;p&gt;Before we start to setup the blue green deployment. i will show you the deployment before implement Blue Green deployment. i will write the docker-compose.yml like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./app&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5001:3000"&lt;/span&gt;


  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-bluegreen&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nginx/nginx.conf:/etc/nginx/nginx.conf&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nginx/active_backend.conf:/etc/nginx/conf.d/active_backend.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and for &lt;strong&gt;nginx.conf&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;events&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;http&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;



    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://host.docker.internal:5001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then i will write the deployment script on &lt;strong&gt;deploy.sh&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;
&lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=================================&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Starting Deployment...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=================================&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[1/5] Building container...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;build&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[2/5] Stopping old container...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[3/5] Removing old container...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[4/5] Starting new container...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;deps&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[5/5] Running health check...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="nx"&gt;STATUS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;%{http_code}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost/api/health-check)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$STATUS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt;
    &lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deployment failed!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;exit&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nx"&gt;fi&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=================================&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deployment Success!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=================================&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the i will running the container using docker compose&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and now when i visit &lt;code&gt;http://localhost&lt;/code&gt; the page will showing&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%2Fdjhopiklfhltxkvcr6y1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdjhopiklfhltxkvcr6y1.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now i will run &lt;code&gt;./deploy.sh&lt;/code&gt; to simulate the deployment process. when i refresh the page many times, i got the &lt;strong&gt;502 bad gateway&lt;/strong&gt; we called this as downtime&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%2Fbln8441oaswhfsz80qnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbln8441oaswhfsz80qnz.png" alt=" " width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the downtime occur because i need to stop the container while i building new image version. so, the page will unavailable for some time. to prevent the downtime we need to create 2 app, one for &lt;strong&gt;active app&lt;/strong&gt; and one for &lt;strong&gt;standby app&lt;/strong&gt;. so when new release detected, we will rebuild the &lt;strong&gt;standby app&lt;/strong&gt;, do the healthy check to make sure the app is healthy, then when app is detected as healthy app, we switch the traffic to &lt;strong&gt;new release app&lt;/strong&gt;. here's the ilustration&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%2Fqa3brsuua6ozhotc7jf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqa3brsuua6ozhotc7jf9.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implement Blue Green
&lt;/h2&gt;

&lt;p&gt;To Implement the Blue Green deployment, we will change our deployment mechanism like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deploy 2 services called app_blue and app_green&lt;/li&gt;
&lt;li&gt;configure the nginx to route the traffic to app_blue&lt;/li&gt;
&lt;li&gt;write the current active app to "blue"&lt;/li&gt;
&lt;li&gt;new deployment detected&lt;/li&gt;
&lt;li&gt;rebuild app_green&lt;/li&gt;
&lt;li&gt;do health check the app_green&lt;/li&gt;
&lt;li&gt;if healthy switch traffic to app_green&lt;/li&gt;
&lt;li&gt;write the current active app to "green"&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create Healthy Check Route
&lt;/h2&gt;

&lt;p&gt;Inside the nextjs app, we will create a route to indicates that the application is running well and healthy&lt;/p&gt;

&lt;p&gt;open &lt;em&gt;app/api/health-check/route.ts&lt;/em&gt; and write the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;run your app&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then test the script by running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;curl http://localhost:3000/api/health-check
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it should return&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after that, we will setup the docker compose to running 2 nextjs app and nginx as load balancer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_blue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./app&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-blue&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5001:3000"&lt;/span&gt;

  &lt;span class="na"&gt;app_green&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./app&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-green&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5002:3000"&lt;/span&gt;

  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-bluegreen&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nginx/nginx.conf:/etc/nginx/nginx.conf&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nginx/active_backend.conf:/etc/nginx/conf.d/active_backend.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on code above, we created 2 services for apps that running on port &lt;code&gt;5001&lt;/code&gt;and &lt;code&gt;5002&lt;/code&gt;. and we created nginx services as a load balancer that will switch the traffic everytime when the new deployment found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Nginx
&lt;/h2&gt;

&lt;p&gt;open nginx folder on the root folder and create &lt;strong&gt;nginx.conf&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;events&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;http&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/etc/nginx/conf.d/active_backend.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://active_backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;strong&gt;nginx.conf&lt;/strong&gt;, we forward all requests to the active backend defined in &lt;code&gt;active_backend.conf&lt;/code&gt;, which is imported from the nginx folder.&lt;/p&gt;

&lt;p&gt;on &lt;code&gt;active_backend.conf&lt;/code&gt; we will write this configuration file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;active_backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="nf"&gt;host.docker.internal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on &lt;code&gt;active_backend.conf&lt;/code&gt; we created the upstream named &lt;code&gt;active_backend&lt;/code&gt;. the &lt;code&gt;active_backend&lt;/code&gt; is route all request to localhost:5001 that running under the docker container. so we must define &lt;strong&gt;host.docker.internal:5001&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Store Current Active App
&lt;/h2&gt;

&lt;p&gt;To store current active app. we will create new file called &lt;strong&gt;active_slot&lt;/strong&gt; which is contain txt content&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment Script
&lt;/h2&gt;

&lt;p&gt;We will create file &lt;code&gt;deploy.sh&lt;/code&gt; to simulate our deployment script including : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;check the active app&lt;/li&gt;
&lt;li&gt;rebuild the standby app&lt;/li&gt;
&lt;li&gt;hit the health check of new release app&lt;/li&gt;
&lt;li&gt;switching the traffic to new release app
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;
&lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;

&lt;span class="nx"&gt;ACTIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cat&lt;/span&gt; &lt;span class="nx"&gt;active_slot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$ACTIVE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt;
    &lt;span class="nx"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;TARGET_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5002&lt;/span&gt;
    &lt;span class="nx"&gt;TARGET_SERVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app_green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="nx"&gt;TARGET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;TARGET_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5001&lt;/span&gt;
    &lt;span class="nx"&gt;TARGET_SERVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app_blue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;fi&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;============================&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Current Active : $ACTIVE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deploy Target  : $TARGET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;============================&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[1/5] Rebuilding $TARGET_SERVICE...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;build&lt;/span&gt; &lt;span class="nx"&gt;$TARGET_SERVICE&lt;/span&gt;
&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;deps&lt;/span&gt; &lt;span class="nx"&gt;$TARGET_SERVICE&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[2/5] Waiting app startup...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[3/5] Running health check...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nx"&gt;STATUS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;%{http_code}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:$TARGET_PORT/api/health-check)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$STATUS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt;
        &lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Health check success!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="nx"&gt;fi&lt;/span&gt;

    &lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retry $i...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="nx"&gt;done&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$STATUS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt;
    &lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Health check failed!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;exit&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nx"&gt;fi&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[4/5] Switching nginx traffic...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;active_backend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;EOF&lt;/span&gt;
&lt;span class="nx"&gt;upstream&lt;/span&gt; &lt;span class="nx"&gt;active_backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;internal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;$TARGET_PORT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;EOF&lt;/span&gt;

&lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="nx"&gt;exec&lt;/span&gt; &lt;span class="nx"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bluegreen&lt;/span&gt; &lt;span class="nx"&gt;nginx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;reload&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$TARGET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;active_slot&lt;/span&gt;

&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[5/5] Deployment success!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Active slot now: $TARGET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;look at&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose build &lt;span class="nv"&gt;$TARGET_SERVICE&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--no-deps&lt;/span&gt; &lt;span class="nv"&gt;$TARGET_SERVICE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because we are running &lt;strong&gt;2 services&lt;/strong&gt; from same image we need to add&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;options to prevent the docker restart the &lt;strong&gt;active app&lt;/strong&gt; while it rebuild the image. so the &lt;strong&gt;active app&lt;/strong&gt; can still running. &lt;/p&gt;

&lt;p&gt;edit &lt;code&gt;page.tsx&lt;/code&gt; and run the &lt;code&gt;deploy.sh&lt;/code&gt;. now the downtime is gone while we deploy new version in our &lt;strong&gt;app&lt;/strong&gt;&lt;/p&gt;

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

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>cloud</category>
      <category>aws</category>
    </item>
    <item>
      <title>Never Put Sensitive Data in Your JWT Payload</title>
      <dc:creator>satriaherman</dc:creator>
      <pubDate>Fri, 14 Nov 2025 03:34:36 +0000</pubDate>
      <link>https://dev.to/_satria_herman/never-put-sensitive-data-in-your-jwt-payload-345i</link>
      <guid>https://dev.to/_satria_herman/never-put-sensitive-data-in-your-jwt-payload-345i</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Do you use JWT for your Authentication?. What the data do you store in the JWT payload?. some non-sensitive data like &lt;strong&gt;user_id&lt;/strong&gt; or sensitive data like &lt;strong&gt;password&lt;/strong&gt;?. If you storing sensitive data in your &lt;strong&gt;JWT Payload&lt;/strong&gt; you should stop it from now.&lt;/p&gt;

&lt;p&gt;In this article i will give you the reason why you shouldn't store sensitive data in your &lt;strong&gt;JWT payload&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is JSON Web Token?
&lt;/h2&gt;

&lt;p&gt;Json Web Token(JWT) is an open standard used for transmitting data between applications in JSON format. JWT is digitally signed in the backend app, so the data cannot be modified by other parties.&lt;/p&gt;

&lt;h2&gt;
  
  
  JWT Structure
&lt;/h2&gt;

&lt;p&gt;by default, JWT structure consists 3 part. &lt;strong&gt;Header&lt;/strong&gt;, &lt;strong&gt;Payload&lt;/strong&gt; dan &lt;strong&gt;Signature&lt;/strong&gt;. Every part is separated by dot symbols &lt;strong&gt;(.)&lt;/strong&gt;. So, it will looks like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header.payload.signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And Here's the example of JSON Web Token&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNzA4MzQ1MTIzLCJleHAiOjE3MDgzNTUxMjN9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Header
&lt;/h3&gt;

&lt;p&gt;Header is containing information the &lt;strong&gt;type&lt;/strong&gt; of token and signing &lt;strong&gt;algorithm&lt;/strong&gt; which is encoded in base64. &lt;/p&gt;

&lt;p&gt;when you go to &lt;a href="https://www.base64decode.org/" rel="noopener noreferrer"&gt;base64-decode&lt;/a&gt; and decode this header&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;it will showing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"alg":"HS256","typ":"JWT"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Payload
&lt;/h3&gt;

&lt;p&gt;Basically Payload is the data that you want to send or people call it &lt;strong&gt;claims&lt;/strong&gt;. &lt;strong&gt;claims&lt;/strong&gt; is divided into 2 type &lt;strong&gt;public claims&lt;/strong&gt; and &lt;strong&gt;private claims&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Registered Claims&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;registered claims is type of claims that already registered by &lt;a href="https://jwt.io" rel="noopener noreferrer"&gt;jwt.io&lt;/a&gt; which recognized as a global standard. the example of registered claims are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iss&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aud&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nbf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jti&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to see full registered claims, you can visit this &lt;a href="https://datatracker.ietf.org/doc/html/rfc7519#section-4.1" rel="noopener noreferrer"&gt;link&lt;/a&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public Claims&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Public Claims is &lt;strong&gt;common claims&lt;/strong&gt; that created by developer. this claims is usually used by most &lt;strong&gt;developers&lt;/strong&gt;. Developers recommended to register  this claims to &lt;a href="https://www.iana.org/assignments/jwt/jwt.xhtml" rel="noopener noreferrer"&gt;IANA JWT registry&lt;/a&gt; to avoid the &lt;strong&gt;collision&lt;/strong&gt; between claims that has same meaning&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private Claims&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Private Claims is custom claims which used by developer to share information between parties and already agree by each parties. This Claims usually used to share information that not included in &lt;strong&gt;registered claims&lt;/strong&gt; and &lt;strong&gt;public claims&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Now, try to decode the &lt;strong&gt;payload&lt;/strong&gt; on &lt;a href="https://www.base64decode.org/" rel="noopener noreferrer"&gt;base64-decode&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;And this is what you got&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"sub":"1234567890","name":"John Doe","iat":1708345123,"exp":1708355123}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks, the data can be decoded &lt;strong&gt;easily!!!&lt;/strong&gt;. This is the reason why you you should not storing &lt;strong&gt;sensitive data&lt;/strong&gt; in your &lt;strong&gt;JWT Payload&lt;/strong&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Signature
&lt;/h3&gt;

&lt;p&gt;Signature is used to &lt;strong&gt;Verify&lt;/strong&gt; if the data is coming from &lt;strong&gt;valid parties&lt;/strong&gt;. This is what makes JWT is &lt;strong&gt;secure&lt;/strong&gt;. let me explain&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signature&lt;/strong&gt; is containing &lt;strong&gt;encoded header&lt;/strong&gt;, the &lt;strong&gt;encoded payload&lt;/strong&gt; and &lt;strong&gt;a secret&lt;/strong&gt;. they are signed using algorithm that defined in &lt;strong&gt;header&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, we are using &lt;strong&gt;HMACSHA256&lt;/strong&gt; algorithm to sign the signature. The system will created the signature like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we send jwt token to backend, the backend will &lt;strong&gt;verify&lt;/strong&gt; if the token has valid &lt;strong&gt;signature&lt;/strong&gt;. with this concept, the hacker cannot &lt;strong&gt;abuse&lt;/strong&gt; the system by modifying the payload. without &lt;strong&gt;secret key&lt;/strong&gt; the hacker cannot generate the valid signature&lt;/p&gt;

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

&lt;p&gt;Payload in &lt;strong&gt;JWT&lt;/strong&gt; can be decoded and accessible for public. so, be aware with the data that you sent in &lt;strong&gt;payload&lt;/strong&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hacker cannot generate valid signature without secret key. Make sure your secret key is safe&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>node</category>
    </item>
    <item>
      <title>How Race Conditions Can Break Your System?</title>
      <dc:creator>satriaherman</dc:creator>
      <pubDate>Thu, 06 Nov 2025 04:47:02 +0000</pubDate>
      <link>https://dev.to/_satria_herman/how-race-condition-will-kill-your-system-ef5</link>
      <guid>https://dev.to/_satria_herman/how-race-condition-will-kill-your-system-ef5</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Singleton&lt;/strong&gt;, is a one of most popular design pattern. The main purpose is to saving memory by reuse and sharing one instance rather than create a new one. It sounds like a great concept, but it could be a "Boomerang" if we implement that concept in the wrong case.&lt;/p&gt;

&lt;p&gt;Helo, i am Satria. Currently i'm working on Tech Company as a &lt;strong&gt;Software Engineer&lt;/strong&gt;. In this article i will share about my experience in implementing Singleton Design Pattern in the wrong case. So, let's go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Started
&lt;/h2&gt;

&lt;p&gt;The Incident is started when i created an application to manage the budgeting system in our company. It is using PostgreSQL as a Database Management System. The application that i built is a part of &lt;strong&gt;Company's Super App&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;When I looked at the code in the Super App, i notice that everytime when we need to query to database, we always use the same &lt;strong&gt;database connection&lt;/strong&gt; and &lt;strong&gt;database session&lt;/strong&gt; that declared as a &lt;strong&gt;global variable&lt;/strong&gt;. here's the sample code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;embed engine = create_engine(url)
Session = sessionmaker(bind=engine)
db = Session() 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everytime we need to querying to database, we always use &lt;strong&gt;db&lt;/strong&gt;  variable. For the first time, i thought&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hmm, This is good. we can reduce the memory usage&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything going well when i test and debug the application by myself. But  the problem occuring when i entering the UAT Process. A lot of issues coming from users in day 1,and 60% of issues is about &lt;strong&gt;Inconsistency Data&lt;/strong&gt;. on the next day the same issue is still coming. and Users put the comment like this&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Why my proposal data is not found?, Why my proposal data is different than i created before, why the approval process is stuck?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Resolving The Problem
&lt;/h2&gt;

&lt;p&gt;At First i thought that the problem is coming from relationship between the table. So, i double-checked on the &lt;strong&gt;model&lt;/strong&gt; and &lt;strong&gt;database&lt;/strong&gt; schema. But, i found no problem with that. i also check the &lt;strong&gt;query to database&lt;/strong&gt;, and still didn't find the problem, the query is fine.   &lt;/p&gt;

&lt;p&gt;I tried all flow of the application again, and still didn't find t the problem. I’m really stressed out by this issue, I spent 3 days just trying to find the problem. On day 3, i remember that my application is using same database session for all query. And when i check on entry point file, our app is using &lt;strong&gt;4 worker&lt;/strong&gt; and every worker can running up to &lt;strong&gt;50 threads&lt;/strong&gt;. That's caused the race condition because one database session is used by more than &lt;strong&gt;one Thread&lt;/strong&gt;. So, i tried to refactor my code and create new database session in every function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def create_proposal():
  db_session = Session()
  try{
   ....
  except:
   db_session.rollback()
  finally:
   db_session.close()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After i refactoring the code like above, The related issue is gone. And my application is ready to serve on Production.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Singleton&lt;/strong&gt; is a good concept to reduce memory usage. but not all type of instances is good to use singleton. In this case, database connection is suitable to use Singleton, because the data &lt;strong&gt;doesn't change everytime it's used&lt;/strong&gt;. But implementing a Singleton for a database session is a bad practice, because a database session can change every time it is used.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/satria-herman/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>Manipulasi DOM Di Reactjs</title>
      <dc:creator>satriaherman</dc:creator>
      <pubDate>Thu, 11 Nov 2021 07:49:49 +0000</pubDate>
      <link>https://dev.to/_satria_herman/manipulasi-dom-4914</link>
      <guid>https://dev.to/_satria_herman/manipulasi-dom-4914</guid>
      <description>&lt;p&gt;Halo semua, apa kabar nih?. Semoga kabarnya baik-baik saja. Kali ini gw akan membahas tentang "gimana caranya manipulasi DOM di Reactjs?".&lt;/p&gt;

&lt;h1&gt;
  
  
  Pendahuluan
&lt;/h1&gt;

&lt;p&gt;Sebelumnya gw mau kasih tau kalo React menggunakan Virtual DOM dalam memanipulasi element HTML nya. Nah sih virtual DOM itu?. Virtual DOM adalah sebuah copy dari DOM yang memiliki property yang sama seperti DOM aslinya. Singkatnya gini jika kita membuat sebuah component dengan nama "Button" di React, maka React akan merender Component Button tersebut kedalam element HTML dan juga membuat Copy dari Element Button itu. nah copy dari element Button ini lah yang disebut "Virtual DOM". Nah pasti ada yang nanya?.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bang kenapa harus buat copy element itu dulu?, kan udah ada element yang di render?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nah ini adalah cara react untuk meminimalisir interaksi antar DOM yang tidak perlu. Misal jika kita punya &lt;strong&gt;10 element list&lt;/strong&gt;. dan kita ingin mengupdate list yang &lt;strong&gt;ketiga&lt;/strong&gt; saja. Maka browser akan mengupdate &lt;strong&gt;semua list&lt;/strong&gt; yang ada. ini akan berdampak pada &lt;strong&gt;performa&lt;/strong&gt; website kita, karena kita mengupdate DOM yang sebenarnya tidak diperlukan. Untuk inilah &lt;strong&gt;Virtual DOM&lt;/strong&gt; hadir sebagai penyelesaian dari masalah ini. Dengan Virtual DOM kita akan &lt;strong&gt;meminimalisir&lt;/strong&gt; terjadinya interaksi antar DOM yang tidak perlu. Virtual DOM akan mengecek perubahan yang ada lalu melakukan update pada DOM yang &lt;strong&gt;berubah saja&lt;/strong&gt;. Sehingga component lain yang tidak dirubah tidak akan &lt;strong&gt;diupdate&lt;/strong&gt; dan &lt;strong&gt;dirender&lt;/strong&gt; ulang.&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%2Fjn52i7a19arq7ssh9ii3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjn52i7a19arq7ssh9ii3.png" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ilustrasi Virtual DOM&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Memanipulasi Virtual DOM
&lt;/h1&gt;

&lt;p&gt;Nah untuk memanipulasi Virtual DOM di Reactjs kita bisa memakai 2 cara yaitu :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menggunakan State&lt;/li&gt;
&lt;li&gt;Menggunakan Ref&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;kedua cara diatas akan kita praktekkan dalam kesempatan kali ini&lt;/p&gt;

&lt;h2&gt;
  
  
  1 Menggunakan State
&lt;/h2&gt;

&lt;p&gt;Untuk manipulasi Virtual DOM menggunakan state ini hanya bisa memanipulasi properti sederhana seperti mengganti class dan id.&lt;/p&gt;

&lt;p&gt;contoh :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;di app.js kita inisialisasikan dulu state nya
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [background, setBackground] = useState('red') 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;lalu kita buat component button yang akan mentrigger perubahan state nya
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;button className={background} onClick={changeBackground}&amp;gt;
        change Background
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  ) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;setelah itu kita buat function changeBackground untuk menghandle button ketika di klik
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const changeBackground = () =&amp;gt; {
    if(background === 'red'){
      setBackground('blue')
    }
    else{
      setBackground('red')
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;lalu di app.css kita buat style untuk class nya
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;red{
  background: red;
}

.blue{
  background: rgb(99, 99, 255);
} 

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

&lt;/div&gt;



&lt;p&gt;hasilnya akan seperti dibawah&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%2Fm9elua0k6556w9d4tzgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9elua0k6556w9d4tzgg.png" alt=" " width="186" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1 Menggunakan Ref
&lt;/h2&gt;

&lt;p&gt;Cara yang kedua adalah menggunakan &lt;code&gt;ref&lt;/code&gt; atau singkatan dari &lt;code&gt;reference&lt;/code&gt;. ref ini adalah sebuah &lt;code&gt;referensi&lt;/code&gt; yang mengarah ke element HTML pada react. &lt;/p&gt;

&lt;p&gt;Jika kita ingin memanipulasi element Virtual DOM maka kita &lt;code&gt;tidak langsung&lt;/code&gt; memanipulasi elementnya, tapi yang kita manipulasi adalah &lt;code&gt;ref&lt;/code&gt; dari element tersebut. Oke langsung saja kita praktekkan&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definisikan sebuah ref menggunakan &lt;code&gt;useRef&lt;/code&gt; jika menggunakan class component pakai &lt;code&gt;createRef&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const buttonRef = useRef();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;lalu letakkan buttonRef diatas ke element yang ingin kita beri referensi&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;button className={background} ref={buttonRef} onClick={changeBackground}&amp;gt;
        change Background
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(masih menggunakan kodingan yang tadi ya). nah setelah itu di function &lt;code&gt;changeBackground()&lt;/code&gt; kita coba memodifikasi element buttonnya menggunakan ref. sebagai contoh saya akan mengubah textContent dari button ketika di click. jadi saya tuliskan seperti ini&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const changeBackground = () =&amp;gt; {
    if(background === 'red'){
      setBackground('blue')
      buttonRef.current.textContent = 'Berubah biru'
    }
    else{
      setBackground('red')
      buttonRef.current.textContent = 'Berubah Merah'
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;nah hasilnya jika kita mengklik button maka background dan tulisan dalam button akan berubah&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%2Fibojozambjrkksott9xy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibojozambjrkksott9xy.png" alt=" " width="142" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sekian dulu Tutorial dari saya. Jika ada salah kata mohon dimaafkan.  Jika ada pertanyaan silahkan hubungi&lt;br&gt;
&lt;a href="https://api.whatsapp.com/send?phone=+628976121070" rel="noopener noreferrer"&gt;Whatsapp&lt;/a&gt; &lt;a href="https://instagram.com/_satria_herman?utm_medium=copy_link" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wassalamu'alaikum Warahmatullahi Wabarakatuh &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Reactjs Overview - (EchLus Community - Part 1)</title>
      <dc:creator>satriaherman</dc:creator>
      <pubDate>Thu, 11 Nov 2021 07:17:39 +0000</pubDate>
      <link>https://dev.to/_satria_herman/reactjs-overview-echlus-community-a06</link>
      <guid>https://dev.to/_satria_herman/reactjs-overview-echlus-community-a06</guid>
      <description>&lt;p&gt;Halo kawan - kawan kali ini saya akan sharing materi tentang "Reactjs Overview". ini merupakan seri sharing session batch tentang Reactjs.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Overview Materi&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Di batch ini kita akan belajar tentang&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install and Setup Reactjs&lt;/li&gt;
&lt;li&gt;Basic Props and State&lt;/li&gt;
&lt;li&gt;React Hooks&lt;/li&gt;
&lt;li&gt;React State Management&lt;/li&gt;
&lt;li&gt;Communicating With Server&lt;/li&gt;
&lt;li&gt;Esbuild&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  1. Install dan Setup Reactjs
&lt;/h1&gt;

&lt;p&gt;Pada proses instalasi kita bisa melihatnya di &lt;a href="https://reactjs.org/docs/create-a-new-react-app.html" rel="noopener noreferrer"&gt;Sini&lt;/a&gt;. untuk instalasinya sebenarnya ada dua cara. yakni dengan menggunakan &lt;a href="https://www.niagahoster.co.id/blog/apa-itu-cdn/" rel="noopener noreferrer"&gt;CDN&lt;/a&gt;. atau dengan menggunakann Create React App(CRA).&lt;/p&gt;

&lt;p&gt;Untuk kesempatan kali ini saya akan menginstall React menggunakan CRA. oke langsung saja ke tutorial.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buka Terminal atau CMD. lalu jalankan &lt;code&gt;npx i create-react-app belajar_react&lt;/code&gt; . npx sendiri kepanjangan dari node package execute. yang mana  jika dijalankan maka akan mengeksekusi package yang sudah maupun belum kita install. dengan menggunakan npx kita tidak perlu menginstall CRA ke dalam local computer kita.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D:\programming\belajar Javascript\react&amp;gt;npx create-react-app belajar_react

Creating a new React app in D:\programming\belajar Javascript\react\belajar_react.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...

[  ................] - fetchMetadata: sill resolveWithNewModule scheduler@0.20.2 checking installable stat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;tunggu prosesnya sampai selesai&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jika sudah selesai ketik perintah &lt;code&gt;cd belajar_react&lt;/code&gt;. lalu ketik perintah &lt;code&gt;code .&lt;/code&gt; agar membuka project kita di &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
