<?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: Ravi Agheda</title>
    <description>The latest articles on DEV Community by Ravi Agheda (@raviagheda).</description>
    <link>https://dev.to/raviagheda</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%2F448655%2F13009770-8cb5-497e-ab14-7fbf52b9abe0.png</url>
      <title>DEV Community: Ravi Agheda</title>
      <link>https://dev.to/raviagheda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raviagheda"/>
    <language>en</language>
    <item>
      <title>Setting Up Llama 3.2 Locally with Ollama and Open WebUI: A Complete Guide</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Wed, 02 Apr 2025 08:56:57 +0000</pubDate>
      <link>https://dev.to/raviagheda/setting-up-llama-32-locally-with-ollama-and-open-webui-a-complete-guide-3lcj</link>
      <guid>https://dev.to/raviagheda/setting-up-llama-32-locally-with-ollama-and-open-webui-a-complete-guide-3lcj</guid>
      <description>&lt;p&gt;We'll use Ollama as tool for setting up the llama3.2 model in our local device.&lt;/p&gt;

&lt;p&gt;Requirements for Llama3.2&lt;/p&gt;

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

&lt;h2&gt;
  
  
  1 Install Ollama
&lt;/h2&gt;

&lt;p&gt;Download the Ollama from here: &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;https://ollama.com/&lt;/a&gt; and install it locally. It should be very easy to install just one click.&lt;br&gt;
It'll automatically setup the CLI path, if not please explore the documentation.&lt;/p&gt;

&lt;p&gt;you can explore the models from supported by ollama here&lt;br&gt;
&lt;a href="https://ollama.com/search" rel="noopener noreferrer"&gt;https://ollama.com/search&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2 Setup the model, in our case Llama3.2
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run llama3.2:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It should download the modal and spin it up in your terminal, you can have chat directly from the terminal &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%2F2p0trlkcgf68vk4ocd4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p0trlkcgf68vk4ocd4n.png" alt="Example of the chat" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we're good that part, now it's time to setup the UI ( like chatGPT )&lt;/p&gt;
&lt;h2&gt;
  
  
  3 Setup Open-WebUI
&lt;/h2&gt;

&lt;p&gt;Open WebUI is an extensible, self-hosted AI interface that adapts to your workflow, all while operating entirely offline.&lt;/p&gt;

&lt;p&gt;Checkout their docs from here: &lt;a href="https://docs.openwebui.com/" rel="noopener noreferrer"&gt;https://docs.openwebui.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we'll use the docker to setup the interface locally, run this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:8080 &lt;span class="nt"&gt;--add-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="nt"&gt;--restart&lt;/span&gt; always ghcr.io/open-webui/open-webui:main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once docker is up successfully go to port 3000 and you're good to go.&lt;/p&gt;

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

&lt;p&gt;You can run other models and change them directly from the open webui interface.&lt;/p&gt;

&lt;p&gt;Enjoy....&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Setting Up Llama 3.2 Locally with Ollama and Open WebUI: A Complete Guide</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Wed, 02 Apr 2025 08:51:08 +0000</pubDate>
      <link>https://dev.to/raviagheda/setup-llm-llama32-locally-and-use-it-like-chatgpt-4kmm</link>
      <guid>https://dev.to/raviagheda/setup-llm-llama32-locally-and-use-it-like-chatgpt-4kmm</guid>
      <description>&lt;p&gt;We'll use Ollama as tool for setting up the llama3.2 model in our local device.&lt;/p&gt;

&lt;p&gt;Requirements for Llama3.2&lt;/p&gt;

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

&lt;h2&gt;
  
  
  1 Install Ollama
&lt;/h2&gt;

&lt;p&gt;Download the Ollama from here: &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;https://ollama.com/&lt;/a&gt; and install it locally. It should be very easy to install just one click.&lt;br&gt;
It'll automatically setup the CLI path, if not please explore the documentation.&lt;/p&gt;

&lt;p&gt;you can explore the models from supported by ollama here&lt;br&gt;
&lt;a href="https://ollama.com/search" rel="noopener noreferrer"&gt;https://ollama.com/search&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2 Setup the model, in our case Llama3.2
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run llama3.2:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It should download the modal and spin it up in your terminal, you can have chat directly from the terminal &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%2F2p0trlkcgf68vk4ocd4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p0trlkcgf68vk4ocd4n.png" alt="Example of the chat" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we're good that part, now it's time to setup the UI ( like chatGPT )&lt;/p&gt;
&lt;h2&gt;
  
  
  3 Setup Open-WebUI
&lt;/h2&gt;

&lt;p&gt;Open WebUI is an extensible, self-hosted AI interface that adapts to your workflow, all while operating entirely offline.&lt;/p&gt;

&lt;p&gt;Checkout their docs from here: &lt;a href="https://docs.openwebui.com/" rel="noopener noreferrer"&gt;https://docs.openwebui.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we'll use the docker to setup the interface locally, run this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:8080 &lt;span class="nt"&gt;--add-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="nt"&gt;--restart&lt;/span&gt; always ghcr.io/open-webui/open-webui:main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once docker is up successfully go to port 3000 and you're good to go.&lt;/p&gt;

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

&lt;p&gt;You can run other models and change them directly from the open webui interface.&lt;/p&gt;

&lt;p&gt;Enjoy....&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>llm</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Creating a GitHub Action for Deploying to Google Cloud Run Using Docker</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Sun, 31 Dec 2023 06:40:47 +0000</pubDate>
      <link>https://dev.to/raviagheda/creating-a-github-action-for-deploying-to-google-cloud-run-using-docker-2ln1</link>
      <guid>https://dev.to/raviagheda/creating-a-github-action-for-deploying-to-google-cloud-run-using-docker-2ln1</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Setup a new Service Account
Create a new service account for our cloud run and deployment process, in order to create a new service account go to &lt;code&gt;IAM &amp;amp; Admin &amp;gt; Service Account &amp;gt; Create New Service Account&lt;/code&gt; Add listed roles to the new service account while creation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Artifact Registry Writer&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Cloud Run Admin&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Editor&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Service Account User&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Storage Admin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create and save the email to GitHub secrets as SERVICE_ACCOUNT_EMAIL and key (JSON) as GCP_SA_KEY we'll need it for the YML file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup Artifact Registry
Create a new artifact registry by visiting Artifact Registry &amp;gt; Create Repository Keep the Docker format for the app deployment select your region.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save registry name and region under github secrets as ARTIFACTION_REGISTRY_NAME and REGION&lt;/p&gt;

&lt;p&gt;We're almost there! In order to enable the apis for cloud run, just visit the cloud run via google cloud console and it should auto enable all the required apis for us.&lt;/p&gt;

&lt;p&gt;Set / Confirm the Github Secrets&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PROJECT_ID&lt;/code&gt; - Id of the google cloud project&lt;br&gt;
&lt;code&gt;REGION&lt;/code&gt; - Make sure to keep the region that we used while creating the artifact registry or update the yml file as per you need&lt;br&gt;
&lt;code&gt;DEV_APP_NAME&lt;/code&gt; - App name that you want to use for the cloud run service name, registry image name and cloud build name ( if build is being used )&lt;br&gt;
&lt;code&gt;ARTIFACT_REGISTRY_NAME&lt;/code&gt; - Artifact Registry name&lt;br&gt;
&lt;code&gt;SERVICE_ACCOUNT_EMAIL&lt;/code&gt; - Service account email that we created earlier&lt;/p&gt;

&lt;p&gt;Follow up this YML File.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note: Current version of yml file use docker based deployment instead of cloud build If you want to use cloud build instead of docker push, then enable cloud build from google cloud console and uncomment line 81 to 84 to 86, also comment out line 76 to 82&lt;/code&gt;&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Deploy to Google Cloud&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;


&lt;span class="c1"&gt;# SERVICE ACCOUNT : cloud-run-and-deploy@semiotic-karma-397201.iam.gserviceaccount.com&lt;/span&gt;
&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;PROJECT_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.PROJECT_ID }}&lt;/span&gt;
  &lt;span class="na"&gt;REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.REGION }}&lt;/span&gt;
  &lt;span class="na"&gt;APP_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DEV_APP_NAME }}&lt;/span&gt;
  &lt;span class="na"&gt;REGISTRY_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.ARTIFACT_REGISTRY_NAME }}&lt;/span&gt;
  &lt;span class="na"&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVICE_ACCOUNT_EMAIL }}&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-and-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup, Build, and Deploy&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="c1"&gt;# Authenticate with Google Cloud&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auth"&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google-github-actions/auth@v1.1.1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;credentials_json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secrets.GCP_SA_KEY&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;

      &lt;span class="c1"&gt;# Setup gcloud CLI/SDK&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Cloud SDK&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google-github-actions/setup-gcloud@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Authorize Docker push&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gcloud auth configure-docker $REGION-docker.pkg.dev&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and tag the docker image&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|-&lt;/span&gt;
          &lt;span class="s"&gt;docker build --build-arg NODE_ENV=dev . --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REGISTRY_NAME/$APP_NAME:$GITHUB_SHA&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Push the image to the Google Artifact Registry (GAR)&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|-&lt;/span&gt;
          &lt;span class="s"&gt;docker push $REGION-docker.pkg.dev/$PROJECT_ID/$REGISTRY_NAME/$APP_NAME:$GITHUB_SHA&lt;/span&gt;

      &lt;span class="c1"&gt;# - name: Build and push the Docker image&lt;/span&gt;
      &lt;span class="c1"&gt;#   run: |-&lt;/span&gt;
      &lt;span class="c1"&gt;#     gcloud builds submit . --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REGISTRY_NAME/$APP_NAME:$GITHUB_SHA&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|-&lt;/span&gt;
          &lt;span class="s"&gt;gcloud run deploy $APP_NAME \&lt;/span&gt;
          &lt;span class="s"&gt;--region $REGION \&lt;/span&gt;
          &lt;span class="s"&gt;--image $REGION-docker.pkg.dev/$PROJECT_ID/$REGISTRY_NAME/$APP_NAME:$GITHUB_SHA \&lt;/span&gt;
          &lt;span class="s"&gt;--platform "managed" \&lt;/span&gt;
          &lt;span class="s"&gt;--service-account $SERVICE_ACCOUNT_EMAIL \&lt;/span&gt;
          &lt;span class="s"&gt;--port 80 \&lt;/span&gt;
          &lt;span class="s"&gt;--quiet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>GitHub Action with EC2 using SSH</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Fri, 25 Aug 2023 04:52:36 +0000</pubDate>
      <link>https://dev.to/raviagheda/github-action-with-ec2-using-ssh-4ej4</link>
      <guid>https://dev.to/raviagheda/github-action-with-ec2-using-ssh-4ej4</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1636819488524-1f019c4e1c44%3Fixlib%3Drb-4.0.3%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D%26auto%3Dformat%26fit%3Dcrop%26w%3D1932%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1636819488524-1f019c4e1c44%3Fixlib%3Drb-4.0.3%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D%26auto%3Dformat%26fit%3Dcrop%26w%3D1932%26q%3D80" alt="Rocket"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's pretty easy to set up GitHub action with AWS EC2 for deployments using SSH key, follow these 3 breakdowns to implement the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Generate SSH Key
&lt;/h2&gt;

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

&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.ssh
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Enter file name: "key_name"&lt;br&gt;
&lt;code&gt;ls&lt;/code&gt; and list out files of the .ssh folder, you should be seeing "key_name" and "key_name.pub"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add public key to authroised keys
```sh
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;cat github-actions.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
For detailed information on SSH Key generation process check this reference: https://zellwk.com/blog/github-actions-deploy/

## 2. Set Github Secrets
SSH_PRIVATE_KEY: private key that we created on ec2
HOST_NAME / IP_ADDRESS: Elastic IP or IP of EC2
USER_NAME: user name of the ec2 user.


## 3. Create a branch_name.yml ( for `dev` branch `dev.yml` ) file under .github/workflows

Update the dev to your branch name

```yml


name: Deploy

on:
  push:
    branches: [ dev ]

jobs:
  Deploy:
    name: Deploy to EC2
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2 
      - name: Build &amp;amp; Deploy
        env:
            PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
            HOSTNAME: ${{secrets.SSH_HOST}}
            USER_NAME: ${{secrets.USER_NAME}}

        run: |
          echo "$PRIVATE_KEY" &amp;gt; private_key &amp;amp;&amp;amp; chmod 600 private_key
          ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOSTNAME} '

              # Now we have got the access of EC2 and we will start the deploy .
              cd /home/ubuntu/&amp;lt;PROJECT_DIRECTORY&amp;gt; &amp;amp;&amp;amp;
              git checkout dev &amp;amp;&amp;amp;
              git fetch --all &amp;amp;&amp;amp;
              git reset --hard origin/dev &amp;amp;&amp;amp;
              git pull origin dev &amp;amp;&amp;amp;
              sudo npm i &amp;amp;&amp;amp;
              sudo npm run build &amp;amp;&amp;amp;
              sudo pm2 stop ./dist/index.js &amp;amp;&amp;amp;
              sudo pm2 start ./dist/index.js
              '


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

&lt;/div&gt;

&lt;p&gt;Gist Ref: &lt;a href="https://gist.github.com/raviagheda/c69ae5e884f4490b1af656dbd80c00dd" rel="noopener noreferrer"&gt;https://gist.github.com/raviagheda/c69ae5e884f4490b1af656dbd80c00dd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;If you are here it means you may have enjoyed reading this blog. Just follow me &lt;a href="https://dev.to/raviagheda"&gt;"Ravi Agheda"&lt;/a&gt; which will motivate to write more, and contribute to open source. You can make me a &lt;a href="https://www.buymeacoffee.com/raviagheda" rel="noopener noreferrer"&gt;coffee☕️&lt;/a&gt; . Small support comes a long way!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>githubactions</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>DS_Store in git, why ?</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Thu, 15 Jun 2023 08:16:12 +0000</pubDate>
      <link>https://dev.to/raviagheda/dsstore-in-git-changes-why--1cbn</link>
      <guid>https://dev.to/raviagheda/dsstore-in-git-changes-why--1cbn</guid>
      <description>&lt;p&gt;Mac user generally face this issue where .DS_Store file gets generated automatically and pops up in the git changes ( unless you've added it in ignore 😅 )&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What is DS_Store?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It known as Desktop Services Store and it holds meta information about your folder’s thumbnails, settings, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These files are created any time you navigate to a file or folder from the Finder on a Mac.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to get rid of it?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Probably you already know the solution, .gitignore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading the short blog.&lt;/p&gt;

</description>
      <category>github</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Love Mongodb ? Try Tigris db once.</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Tue, 18 Apr 2023 05:12:54 +0000</pubDate>
      <link>https://dev.to/raviagheda/love-mongodb-try-tigris-db-once-52pn</link>
      <guid>https://dev.to/raviagheda/love-mongodb-try-tigris-db-once-52pn</guid>
      <description>&lt;p&gt;Tigris db is one the best no sql database I came across after the mongodb.&lt;/p&gt;

&lt;p&gt;We love mongodb for it's ease of use and features, powered queries easy model setup, complex operations. &lt;br&gt;
But still there are many things we have to handle on our own, i.e. Environment based setup etc.&lt;/p&gt;

&lt;p&gt;Whereas Tigris provide native integration for branching enviroments, we can setup the main, staging, dev branch for different database using env config.&lt;/p&gt;

&lt;p&gt;In order to get one more step further we have a tigris db to explore. Let's discuss some key points difference of tigris db and mongodb to get more idea around it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez07pwj3fdz6qpbt2tkc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez07pwj3fdz6qpbt2tkc.jpeg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How Tigris differ from MongoDB from the tigris doc&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Unlike MongoDB, Tigris follows a modern composable architecture with loosely coupled components. Furthermore, compute is separated from storage, allowing for independent scaling and a more resilient system.&lt;/li&gt;
&lt;li&gt;The storage layer in Tigris is built on FoundationDB, and Tigris inherits the strong consistency guarantees, and the scalability of FoundationDB.&lt;/li&gt;
&lt;li&gt;Tigris provides automatic database sharding, and shard keys are unnecessary as the data distribution is automatically handled. This ensures true serverless behavior with no painful transition from a non-sharded to a sharded MongoDB cluster.&lt;/li&gt;
&lt;li&gt;Tigris' open source Kubernetes-native design allows it to be deployed anywhere in the cloud in the user's account, ensuring that the user is always in control of their data.&lt;/li&gt;
&lt;li&gt;Some other differentiating features include global interactive ACID transactions, consistent secondary indexes, and an integrated search platform.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;To try the Tigirs database with express app, visit: &lt;a href="https://www.tigrisdata.com/"&gt;https://www.tigrisdata.com/&lt;/a&gt;&lt;br&gt;
Signup, and create a test app. It'll provide a command set of npm. Create an express app using it and you'll be able to explore the codebase and queries.&lt;/p&gt;

&lt;p&gt;Here's a reference of express tigris app: &lt;a href="https://github.com/raviagheda/express-tigrisdb"&gt;https://github.com/raviagheda/express-tigrisdb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fun Fact: If we move to tigress db then our stacks will be as follow MEAN will be NEAT, and MERN will be TERN.&lt;/p&gt;

&lt;p&gt;If you are here it means you may have enjoyed reading this blog. Just follow me "Ravi Agheda"&lt;br&gt;
which will motivate to write more, and contribute to open source. You can make me a coffee☕️ . Small support comes a long way!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>mongodb</category>
      <category>express</category>
    </item>
    <item>
      <title>The Art of Debugging: Techniques for Effective Problem-Solving</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Sat, 15 Apr 2023 19:33:21 +0000</pubDate>
      <link>https://dev.to/raviagheda/the-art-of-debugging-techniques-for-effective-problem-solving-3b66</link>
      <guid>https://dev.to/raviagheda/the-art-of-debugging-techniques-for-effective-problem-solving-3b66</guid>
      <description>&lt;p&gt;&lt;strong&gt;Debugging&lt;/strong&gt; is an essential part of the software development process. It's the process of identifying and resolving errors, bugs, or issues that prevent the code from running correctly. However, debugging is often seen as a tedious and frustrating task, and many developers struggle with finding effective techniques to solve problems efficiently. In this blog post, we'll explore some creative and unique techniques that can help developers improve their debugging skills and become more effective problem-solvers.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Divide and Conquer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The divide and conquer approach involves breaking down a problem into smaller, more manageable pieces. This technique is particularly useful when dealing with complex issues that involve multiple components or dependencies. By isolating the problem, developers can focus their efforts on specific areas, reducing the scope of the issue and making it easier to solve. This technique is also useful for identifying the root cause of a problem, which can help prevent similar issues from arising in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Rubber Duck Debugging&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Rubber Duck Debugging is a technique that involves explaining the problem to an inanimate object, such as a rubber duck. This technique may sound silly, but it's a useful way to approach problems from a different perspective. By explaining the problem out loud, developers can often identify issues they might have overlooked. This technique is also useful for clarifying the problem to other team members, which can help improve collaboration and communication.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Debugging with Print Statements&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Debugging with print statements involves inserting log statements into the code to track the execution flow and identify issues. This technique is particularly useful for tracking down issues that are difficult to reproduce or that occur intermittently. By logging key variables or function calls, developers can gain insights into the behavior of the code and identify areas where issues are occurring. This technique is also useful for gaining a better understanding of how the code is executing, which can help improve overall code quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Pair Programming&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pair programming involves two developers working together on the same codebase, sharing ideas and solving problems collaboratively. This technique is particularly useful when dealing with complex issues that require a fresh perspective or expertise in a specific area. By working together, developers can share knowledge, identify issues more quickly, and come up with more creative solutions. Pair programming is also an excellent way to improve team collaboration and communication, which can lead to more effective problem-solving in the long run.&lt;/p&gt;

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

&lt;p&gt;Debugging is a critical skill for developers, but it can also be a frustrating and time-consuming process. By using the creative and unique techniques discussed in this blog post, developers can approach problems from a fresh perspective, improve collaboration and communication, and become more effective problem-solvers. To implement these techniques successfully, it's essential to prioritize clear and concise communication with your team, maintain a detailed record of the debugging process, and be willing to experiment with different methods until you find what works best for you. Remember, the art of debugging is not just about finding and fixing issues; it's also about developing a problem-solving mindset that focuses on continuous improvement and finding creative solutions to complex problems.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to integrate swagger ui in your node project with auto generation ?</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Sat, 04 Mar 2023 11:59:43 +0000</pubDate>
      <link>https://dev.to/raviagheda/how-to-integrate-swagger-ui-in-your-node-project-with-auto-generation--5aei</link>
      <guid>https://dev.to/raviagheda/how-to-integrate-swagger-ui-in-your-node-project-with-auto-generation--5aei</guid>
      <description>&lt;p&gt;Swagger is a tool for documenting and testing APIs. It provides an interface for exploring endpoints, testing input and output data, and generating client libraries for different programming languages. &lt;/p&gt;

&lt;p&gt;In this blog post, we will look at how to integrate Swagger into a Node.js project using the Swagger UI and Swagger Autogen libraries and output JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Swagger UI and Swagger Autogen&lt;/strong&gt;&lt;br&gt;
The first step is to install the Swagger UI and Swagger Autogen libraries. We can do this using npm. Open a terminal window and navigate to the root directory of your Node.js project. Then, run the following command:&lt;/p&gt;

&lt;p&gt;Swagger is a tool for documenting and testing APIs. It provides an interface for exploring endpoints, testing input and output data, and generating client libraries for different programming languages. In this blog post, we will look at how to integrate Swagger into a Node.js project using the Swagger UI and Swagger Autogen libraries and output JSON.&lt;/p&gt;

&lt;p&gt;Installing Swagger UI and Swagger Autogen&lt;br&gt;
The first step is to install the Swagger UI and Swagger Autogen libraries. We can do this using npm. Open a terminal window and navigate to the root directory of your Node.js project. Then, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;swagger-ui-express swagger-autogen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will install the Swagger UI and Swagger Autogen libraries in your project.&lt;/p&gt;

&lt;p&gt;Setting up Swagger UI&lt;br&gt;
Once the libraries are installed, we need to set up Swagger UI in our Node.js project. Create a new file in your project root directory called swagger.js. This file will contain the Swagger UI setup code.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;swaggerUi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swagger-ui-express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;swaggerDocument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./swagger.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api-docs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;swaggerUi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;swaggerUi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;swaggerDocument&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;This code sets up the Swagger UI middleware for our Express app. The swaggerUi.serve middleware serves the Swagger UI files, and the swaggerUi.setup middleware creates a new route at &lt;code&gt;/api-docs&lt;/code&gt; where we can access the Swagger UI.&lt;/p&gt;

&lt;p&gt;The swaggerDocument variable is a JSON file that describes the API endpoints, input and output data, and other details about our API. We will create this file later in this blog.&lt;/p&gt;

&lt;p&gt;Setting up Swagger Autogen&lt;br&gt;
Now that we have set up Swagger UI, we need to set up Swagger Autogen. This library automatically generates Swagger documentation based on our Express app's route handlers.&lt;/p&gt;

&lt;p&gt;Create a new file in your project root directory called &lt;code&gt;swagger-autogen.js&lt;/code&gt;. This file will contain the Swagger Autogen setup code.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;swaggerAutogen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swagger-autogen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./swagger.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endpointsFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./routes/*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Blog API Documentation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;tags&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="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost:3000/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;schemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;swaggerAutogen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endpointsFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;This code sets up Swagger Autogen to generate Swagger documentation for our API endpoints. The outputFile variable is the name of the JSON file where the documentation will be saved. The endpointsFiles variable is an array of paths to our Express app's route handler files.&lt;/p&gt;

&lt;p&gt;Let me know in the comment, if your swagger requirement is resolved by this blog.&lt;/p&gt;

&lt;p&gt;And, You can make me a &lt;a href="https://www.buymeacoffee.com/raviagheda"&gt;coffee☕️&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading through, Follow me for more content :)&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>api</category>
    </item>
    <item>
      <title>Setup AWS S3 bucket for NodeJS</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Sat, 07 Jan 2023 18:11:29 +0000</pubDate>
      <link>https://dev.to/raviagheda/setup-aws-s3-bucket-for-nodejs-4j99</link>
      <guid>https://dev.to/raviagheda/setup-aws-s3-bucket-for-nodejs-4j99</guid>
      <description>&lt;p&gt;Amazon Simple Storage Service (S3) is one of the best tool to store the file/media. Let's set it up with nodejs framework.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup S3 bucket with public access. &lt;/li&gt;
&lt;li&gt;Integrate S3 with NodeJS.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Setup S3 bucket with public access.
&lt;/h3&gt;

&lt;p&gt;First thing first, let's create a bucket&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcx1g6olwka5xuovarcwq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcx1g6olwka5xuovarcwq.png" alt="Create Bucket Image" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the name and Change the region if required, here I'm keeping it Oregon as default.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fua5xw70j4z2ai9txwynp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fua5xw70j4z2ai9txwynp.png" alt="Enter Bucket Name Image" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I need a public bucket so I'm enabling a ACL and keeping Radio options as it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6lzilf258axp6yob326.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6lzilf258axp6yob326.png" alt="Enable ACL Image" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same as above, uncheck the checkbox in order to make it public.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc469f1ic105opqe9c4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc469f1ic105opqe9c4g.png" alt="Block Public Access Image" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Keep rest of the options as it is unless required, and hit create bucket button.&lt;br&gt;
Now once bucket is created we would have to update the bucket policy in order to access it as public bucket. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a Bucket&lt;/li&gt;
&lt;li&gt;Go to permission and scroll down to Bucket Policy, and Edit
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2008-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowPublicRead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Principal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"AWS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"s3:GetObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:s3:::ravis-blog-bucket/*"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Scroll down to CORS policy and Edit
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AllowedHeaders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AllowedMethods"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"PUT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"AllowedOrigins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ExposeHeaders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Make sure that you update the bucket name inside the policy code "Resource".&lt;/p&gt;

&lt;p&gt;In order to test the setup, upload a single file and try to access it from outside, i.e. Incognito.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Integrate S3 with NodeJS
&lt;/h3&gt;

&lt;p&gt;Assuming you already have express app setup and we are ready to proceed with aws sdk setup. In order to acccess S3 apis from nodejs we would need to install &lt;code&gt;aws-sdk&lt;/code&gt; npm package.&lt;/p&gt;

&lt;p&gt;Lets also install the &lt;code&gt;uuid&lt;/code&gt; and &lt;code&gt;mime&lt;/code&gt; as helper packages.&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;S3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uuid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;S3&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uploading file -&amp;gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AWS_S3_BUCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// ravis-blog-bucket&lt;/span&gt;
        &lt;span class="na"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nf"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;_.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getExtension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mimetype&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&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;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&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;Now it's ready for user, we can call the uploader function and pas multipart file and filePath ( location path at S3, i.e. images/logos/ ).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to redirect the domain to the port number using Nginx and set up SSL?</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Wed, 25 May 2022 11:06:33 +0000</pubDate>
      <link>https://dev.to/raviagheda/configure-nginx-and-ssl-on-linux-instance-25oe</link>
      <guid>https://dev.to/raviagheda/configure-nginx-and-ssl-on-linux-instance-25oe</guid>
      <description>&lt;h1&gt;
  
  
  Nginx Configuration Setup
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04"&gt; Install Nginx &lt;/a&gt;
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Link port with domain
&lt;/h2&gt;

&lt;p&gt;Open this file in nano or vim &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http&lt;span class="o"&gt;{&lt;/span&gt;
  server&lt;span class="o"&gt;{&lt;/span&gt;
    listen 80&lt;span class="p"&gt;;&lt;/span&gt;
    server_name DOAMIN.com www.DOMAIN.com&lt;span class="p"&gt;;&lt;/span&gt;
    location / &lt;span class="o"&gt;{&lt;/span&gt;
      proxy_set_header X-Real-IP &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      proxy_set_header Host &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      proxy_pass http://&amp;lt;IP_ADDRESS&amp;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="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After updating nginx.conf apply this commands &lt;br&gt;
Test nginx.conf &lt;code&gt;sudo nginx -t&lt;/code&gt;&lt;br&gt;
Restart nginx service &lt;code&gt;sudo systemctl restart nginx&lt;/code&gt; or &lt;code&gt;sudo service nginx restart&lt;/code&gt;&lt;br&gt;
Check nginx status &lt;code&gt;sudo systemctl status nginx&lt;/code&gt; or &lt;code&gt;sudo service nginx status&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Issue ssl certificate from certbot
&lt;/h2&gt;

&lt;p&gt;Ref: &lt;a href="https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/"&gt;https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Install certbot
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Obtain the SSL/TLS Certificate
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sudo certbot --nginx -d example.com -d www.example.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It'll handle the required modification for https in nginx.conf&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/#auto-renewal"&gt;Automatically Renew Let’s Encrypt Certificates&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;crontab -e&lt;/code&gt;&lt;br&gt;
&lt;code&gt;0 12 * * * /usr/bin/certbot renew --quiet&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Manually setup SSL and https configuration on nginx
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http&lt;span class="o"&gt;{&lt;/span&gt;
  server&lt;span class="o"&gt;{&lt;/span&gt;
    listen 80&lt;span class="p"&gt;;&lt;/span&gt;
    server_name spotcodes.in www.spotcodes.in&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;301 https://&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  server &lt;span class="o"&gt;{&lt;/span&gt;
    listen 443 ssl&lt;span class="p"&gt;;&lt;/span&gt;
    server_name spotcodes.in www.spotcodes.in&lt;span class="p"&gt;;&lt;/span&gt;

    ssl_certificate /etc/letsencrypt/live/spotcodes.in/cert.pem&lt;span class="p"&gt;;&lt;/span&gt;
    ssl_certificate_key /etc/letsencrypt/live/spotcodes.in/privkey.pem&lt;span class="p"&gt;;&lt;/span&gt;

    location / &lt;span class="o"&gt;{&lt;/span&gt;
    proxy_set_header X-Real-IP &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    proxy_set_header Host &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    proxy_pass http://3.83.202.107:2001&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="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h3&gt;
  
  
  Test SSL certificate installation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.experte.com/ssl-check"&gt;https://www.experte.com/ssl-check&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Usefull links and credits
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/#auto-renewal"&gt;https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/#auto-renewal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04"&gt;https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://levelup.gitconnected.com/how-to-install-ssl-certificate-for-nginx-server-in-amazon-linux-2986f51371fb"&gt;https://levelup.gitconnected.com/how-to-install-ssl-certificate-for-nginx-server-in-amazon-linux-2986f51371fb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=X3Pr5VATOyA"&gt;https://www.youtube.com/watch?v=X3Pr5VATOyA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>nginx</category>
      <category>ssl</category>
      <category>https</category>
    </item>
    <item>
      <title>Mongoose auto timestamp</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Tue, 02 Feb 2021 06:21:55 +0000</pubDate>
      <link>https://dev.to/raviagheda/mongoose-auto-timestamp-5gjc</link>
      <guid>https://dev.to/raviagheda/mongoose-auto-timestamp-5gjc</guid>
      <description>&lt;h2&gt;
  
  
  Let mongoose schema handle timestamps for you
&lt;/h2&gt;

&lt;p&gt;It's a little difficult to manage createdAt and updatedAt on each Create and Update operation.&lt;/p&gt;

&lt;p&gt;We can have it handled by mongoose built-in features.There are three ways to add timestamps in mongoose schema &lt;/p&gt;

&lt;h2&gt;
  
  
  1. createdAt and updatedAt in timestamp format.
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mySchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&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="na"&gt;timestamps&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;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  output:
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;createdAt: 2021-02-02T06:12:26.668Z&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;updatedAt: 2021-02-02T06:12:48.930Z&lt;/code&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  2. Timestamp with a custom field name
&lt;/h2&gt;

&lt;p&gt;By default, the names of the fields are createdAt and updatedAt. Customize the field names by setting &lt;code&gt;timestamps.createdAt&lt;/code&gt; and &lt;code&gt;timestamps.updatedAt&lt;/code&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mySchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&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="na"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;addedAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;modifiedAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  output:
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;addedAt: 2021-02-02T06:12:26.668Z&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;modifiedAt: 2021-02-02T06:12:48.930Z&lt;/code&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  3. Timestamp with number format (double)
&lt;/h2&gt;

&lt;p&gt;By default, Mongoose uses &lt;code&gt;new Date()&lt;/code&gt; to get the current time. If you want to overwrite the function Mongoose uses to get the current time, you can set the timestamps.currentTime option. Mongoose will call the &lt;code&gt;timestamps.currentTime&lt;/code&gt; function whenever it needs to get the current time.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mySchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&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="na"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;currentTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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;h4&gt;
  
  
  output:
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;createdAt: 1612246845043&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;updatedAt: 1612246853068&lt;/code&gt; &lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>database</category>
      <category>javascript</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How to host Angular app on Heroku</title>
      <dc:creator>Ravi Agheda</dc:creator>
      <pubDate>Sun, 31 Jan 2021 17:04:33 +0000</pubDate>
      <link>https://dev.to/raviagheda/how-to-host-angular-app-on-heroku-1n58</link>
      <guid>https://dev.to/raviagheda/how-to-host-angular-app-on-heroku-1n58</guid>
      <description>&lt;p&gt;We need an express server to make the Angular app live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install express and path.
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm install express path&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;server.js&lt;/code&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dist/&amp;lt;FOLDER_NAME&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Link index.html of build folder with router.&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dist/&amp;lt;FOLDER_NAME&amp;gt;/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;


&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add these lines in &lt;code&gt;package.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;inside &lt;code&gt;scripts&lt;/code&gt;&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="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node server.js"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"heroku-postbuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ng build --prod"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add engines inside &lt;code&gt;package.json&lt;/code&gt;&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="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14.15.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6.14.9"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add this project to GitHub and connect this repository with your Heroku app.
&lt;/h3&gt;

&lt;p&gt;Click on deploy.&lt;/p&gt;

&lt;p&gt;Thanks for reading :)&lt;/p&gt;

</description>
      <category>angular</category>
      <category>heroku</category>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
