<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>All Published Posts on Budi ☕ @budimanfajarf</title><link>https://budi.day/posts/</link><description>Recent content in All Published Posts on Budi ☕ @budimanfajarf</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Mon, 07 Apr 2025 19:30:17 +0700</lastBuildDate><atom:link href="https://budi.day/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Bercengkerama dengan Tuhan</title><link>https://budi.day/2025/04/2025-04-07-bercengkerama-dengan-tuhan/</link><pubDate>Mon, 07 Apr 2025 19:30:17 +0700</pubDate><guid>https://budi.day/2025/04/2025-04-07-bercengkerama-dengan-tuhan/</guid><description>Image source: Chat GPT
Pernah gak sih kalian curhat ke Tuhan tapi dengan perasaan malu-malu?
Di satu sisi, kita sadar banget kalau dosa kita tuh gak sedikit—ada aja yang kita lakuin tiap hari, entah sengaja atau gak. Tapi di sisi lain… ke siapa lagi kita bisa memohon pertolongan kalau bukan ke Tuhan?
Aku pernah ngalamin momen di mana aku berdoa sambil minta tolong, tapi rasanya kayak canggung sendiri. Malu. Karena sadar, “Ya ampun, dosa gue banyak banget.</description><content type="html"><![CDATA[<figure class="left"><img src="/uploads/compressed/bercengkerama-dengan-tuhan.png"
         alt="Image source: Chat GPT"/><figcaption>
            <p>Image source: <a href="https://chat.openai.com/">Chat GPT</a></p>
        </figcaption>
</figure>

<p>Pernah gak sih kalian <em>curhat</em> ke Tuhan tapi dengan perasaan malu-malu?</p>
<p>Di satu sisi, kita sadar banget kalau dosa kita tuh gak sedikit—ada aja yang kita lakuin tiap hari, entah sengaja atau gak. Tapi di sisi lain… ke siapa lagi kita bisa memohon pertolongan kalau bukan ke Tuhan?</p>
<p>Aku pernah ngalamin momen di mana aku berdoa sambil minta tolong, tapi rasanya kayak canggung sendiri. Malu. Karena sadar, “Ya ampun, dosa gue banyak banget.” Tapi entah kenapa, di saat itu juga aku ngerasa deket banget sama Tuhan. Rasanya kayak lagi ngobrol pelan-pelan, penuh harap, penuh pengakuan, tapi juga penuh cinta.</p>
<p>Kayak,</p>
<blockquote>
<p>“Ya Allah… hamba sadar, hamba banyak dosa. Tapi kepada siapa lagi hamba bisa meminta pertolongan, Ya Allah… 😭</p>
<p>sambil tersenyum kecil, “hehe…”</p>
</blockquote>
<p>Di sanalah aku merasa&hellip; Tuhan itu benar-benar Maha Pengampun. Maha Penyayang. Bahkan saat aku datang dengan tangan penuh luka dan hati penuh malu, Dia tetap memelukku dalam tenangnya. Bercengkerama dalam diam, tapi terasa hangat sekali.</p>
]]></content></item><item><title>Malas Olahraga</title><link>https://budi.day/2023/08/malas-olahraga/</link><pubDate>Sat, 12 Aug 2023 10:57:21 +0700</pubDate><guid>https://budi.day/2023/08/malas-olahraga/</guid><description>Image source: pinterest
Kamu mungkin bukan malas olahraga, tapi kamu mungkin tidak punya teman olahraga, coba cari atau ajak teman yang mau diajak olahraga bareng-bareng.
Kamu mungkin bukan malas olahraga, tapi kamu mungkin tidak suka keramaian, coba olahraga di tempat atau di waktu yang tidak terlalu ramai.
Kamu mungkin bukan malas olahraga, tapi kamu mungkin &amp;hellip;silahkan diisi</description><content type="html"><![CDATA[<figure class="left"><img src="/uploads/lazy-cropped.jpeg"
         alt="Image source: pinterest"/><figcaption>
            <p>Image source: <a href="https://pinterest.com/pin/829506825099692720">pinterest</a></p>
        </figcaption>
</figure>

<p>Kamu mungkin bukan malas olahraga, tapi kamu mungkin tidak punya teman olahraga, coba cari atau ajak teman yang mau diajak olahraga bareng-bareng.</p>
<p>Kamu mungkin bukan malas olahraga, tapi kamu mungkin tidak suka keramaian, coba olahraga di tempat atau di waktu yang tidak terlalu ramai.</p>
<p>Kamu mungkin bukan malas olahraga, tapi kamu mungkin <em>&hellip;<small>silahkan diisi</em></small></p>
]]></content></item><item><title>Untuk siapapun, selamat ya!</title><link>https://budi.day/2023/08/untuk-siapapun-selamat-ya/</link><pubDate>Tue, 01 Aug 2023 06:12:03 +0700</pubDate><guid>https://budi.day/2023/08/untuk-siapapun-selamat-ya/</guid><description>Photo source: unsplash
Untuk siapapun,
Selamat atas pencapaian besarmu! Kalau belum terwujud, selamat atas pencapaian-pencapaian kecilmu.
Pencapaian kecil yang sering tidak diperhatikan, padahal cukup patut dirayakan, dirayakan dengan segelas kopi, makanan favorit, atau setidaknya mendapatkan kepuasan batin dan rasa syukur :)</description><content type="html"><![CDATA[<figure class="left"><img src="/uploads/compressed/wil-stewart-UErWoQEoMrc-unsplash.jpeg"
         alt="Photo source: unsplash"/><figcaption>
            <p>Photo source: <a href="https://unsplash.com/photos/UErWoQEoMrc?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">unsplash</a></p>
        </figcaption>
</figure>

<p>Untuk siapapun,</p>
<p>Selamat atas pencapaian besarmu! Kalau belum terwujud, selamat atas pencapaian-pencapaian kecilmu.</p>
<p>Pencapaian kecil yang sering tidak diperhatikan, padahal cukup patut dirayakan, dirayakan dengan segelas kopi, makanan favorit, atau setidaknya mendapatkan kepuasan batin dan rasa syukur :)</p>
]]></content></item><item><title>Makanan tapi bukan Makanan</title><link>https://budi.day/2023/06/makanan-tapi-bukan-makanan/</link><pubDate>Sat, 17 Jun 2023 20:03:00 +0700</pubDate><guid>https://budi.day/2023/06/makanan-tapi-bukan-makanan/</guid><description>DALL·E generated image
Ketika membuka feed sosial media, entah itu facebook, instagram, tiktok, dll. Bayangkan kalo itu seperti kita membuka kulkas, itulah hal-hal yang akan kita &amp;ldquo;makan&amp;rdquo; hari itu, itulah yang akan kita konsumsi, dan itu akan mempengaruhi kita.
Kita tidak pasif, kita aktif dalam mengkonsumsi hal-hal tersebut, kita tidak &amp;ldquo;hanya melihatnya&amp;rdquo;, ini seperti kita memakannya.
Karena mata adalah jendela hati, kita tidak bisa melihat sesuatu tanpa mempengaruhi hati kita.</description><content type="html"><![CDATA[<!--
What you listen to
What you look at
What you read
What you watch
What you talk about
All of this think about it as input
It's like food
That you're putting into your body, Right?
And so I ask people to imagine
Everytime you open your feed
Your feed meaning your feed wheter it on Facebook, Instagram, Twitter
Imagine then when you open your feed
It's like opening your fridge
That's what you're gonna eat that day
That's what you're in taking
And so that affects you
I need you understand that
You are not passive
Yo're not passively in taking
You're actively in taking those things
You're not just looking at it
I need you to understand
There's no such thing as "I'm just looking"
Whatever you look at
It's like you're swallowing it
It's like you're eating it
Because the eyes are a window to the heart
That's the way Allah designed it
You can't look at something without it affecting your heart
-->
<figure class="left"><img src="/uploads/DALL%c2%b7E%202023-06-17%2021.36.33%20-%20social%20media%20food.png"
         alt="DALL·E generated image"/><figcaption>
            <p><a href="https://openai.com/dall-e-2">DALL·E</a> generated image</p>
        </figcaption>
</figure>

<p>Ketika membuka <em>feed</em> sosial media, entah itu <em>facebook</em>, <em>instagram</em>, <em>tiktok</em>, dll.
Bayangkan kalo itu seperti kita membuka kulkas, itulah hal-hal yang akan kita &ldquo;makan&rdquo; hari itu, itulah yang akan kita konsumsi, dan itu akan mempengaruhi kita.</p>
<p>Kita tidak pasif, kita aktif dalam mengkonsumsi hal-hal tersebut, kita tidak &ldquo;hanya melihatnya&rdquo;, ini seperti kita memakannya.</p>
<p>Karena mata adalah jendela hati, kita tidak bisa melihat sesuatu tanpa mempengaruhi hati kita.</p>
<p><small><em>Sumber: <a href="https://www.instagram.com/reel/CsWVGbvtgKM/?igshid=MTBlZjE4YzMxOA==">instagram.com/elitereminders</a></em></small></p>
]]></content></item><item><title>The Guest House</title><link>https://budi.day/2023/06/the-guest-house-by-rumi/</link><pubDate>Thu, 15 Jun 2023 09:27:10 +0700</pubDate><guid>https://budi.day/2023/06/the-guest-house-by-rumi/</guid><description>Poem by Jalaluddin Rumi
The Guest House This being human is a guest house.
Every morning a new arrival.
A joy, a depression, a meanness,
some momentary awareness comes
as an unexpected visitor.
Welcome and entertain them all!
Even if they’re a crowd of sorrows,
who violently sweep your house
empty of its furniture,
still, treat each guest honorably.
He may be clearing you out
for some new delight.
The dark thought, the shame, the malice,</description><content type="html"><![CDATA[<p>Poem by Jalaluddin Rumi</p>

  <div class="poem">
    
      <img
        class="poem__image"
        src='/uploads/watercolor-halo-safflower%20tree_6243735.png'
         alt='The Guest House' 
         style='max-width: 320px' 
      />
    

    <div class="poem__content">
      
        <h1 class="poem__title">The Guest House</h1>
      

      This being human is a guest house.<br />Every morning a new arrival.<br /><br />A joy, a depression, a meanness,<br />some momentary awareness comes<br />as an unexpected visitor.<br /><br />Welcome and entertain them all!<br />Even if they’re a crowd of sorrows,<br />who violently sweep your house<br />empty of its furniture,<br />still, treat each guest honorably.<br />He may be clearing you out<br />for some new delight.<br /><br />The dark thought, the shame, the malice,<br />meet them at the door laughing,<br />and invite them in.<br /><br />Be grateful for whoever comes,<br />because each has been sent<br />as a guide from beyond.

      
        <p class="poem__by">~ RUMI ~</p>
      
    </div>
  </div>


<ul>
<li><small><em>Source: <a href="https://www.scottishpoetrylibrary.org.uk/">scottishpoetrylibrary.org.uk</a></em></small></li>
<li><small><em>Image source: <a href="https://pngtree.com/so/Watercolor'">pngtree.com</a></em></small></li>
</ul>
]]></content></item><item><title>Belajar dari Abu Nawas dalam Berdoa yang begitu Romantis</title><link>https://budi.day/2023/06/belajar-dari-abu-nawas-dalam-berdoa-yang-begitu-romantis/</link><pubDate>Sun, 11 Jun 2023 16:18:42 +0700</pubDate><guid>https://budi.day/2023/06/belajar-dari-abu-nawas-dalam-berdoa-yang-begitu-romantis/</guid><description>Photo source: unsplash
Dengan bahasa apa kita berdoa? Jawaban utamanya adalah dengan bahasa hati. Karena apa yang keluar dari hati, pasti indah dan Tuhan menyukai keindahan. Sedangkan mengenai bahasa hati itu akan diterjemahkan dalam bentuk bahasa Arab, Indonesia, atau lainnya, bebas.
Kita bisa belajar dari Abu Nawas dalam berdoa, yang begitu romantis.
Wahai Tuhanku, hamba tak pantas menjadi penghuni surga.
Namun, hamba pun tak sanggup menjadi penghuni neraka.
Terimalah tobat-tobat hamba dan ampunilah dosa-dosa hamba.</description><content type="html"><![CDATA[<figure class="normal"><img src="/uploads/masjid-maba-QhzQfD0ihnI-unsplash.jpeg"
         alt="Photo source: unsplash"/><figcaption>
            <p>Photo source: <a href="https://unsplash.com/photos/QhzQfD0ihnI?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditShareLink">unsplash</a></p>
        </figcaption>
</figure>

<p>Dengan bahasa apa kita berdoa? Jawaban utamanya adalah dengan bahasa hati. Karena apa yang keluar dari hati, pasti indah dan Tuhan menyukai keindahan. Sedangkan mengenai bahasa hati itu akan diterjemahkan dalam bentuk bahasa Arab, Indonesia, atau lainnya, bebas.</p>
<p>Kita bisa belajar dari Abu Nawas dalam berdoa, yang begitu romantis.</p>
<blockquote>
<p>Wahai Tuhanku, hamba tak pantas menjadi penghuni surga.</p>
<p>Namun, hamba pun tak sanggup menjadi penghuni neraka.</p>
<p>Terimalah tobat-tobat hamba dan ampunilah dosa-dosa hamba.</p>
<p>Sesungguhnya Engkaulah Maha Pengampun atas segala dosa yang hamba perbuat.</p>
<p>Dosa-dosa hamba bagaikan tumpukan pasir.</p>
<p>Terimalah tobat hamba, wahai yang Mahamulia.</p>
<p>Sementara umur hamba kian hari kian berkurang.</p>
<p>Dan dosa hamba kian bertambah, bagaimana mungkin hamba mampu memikulnya.</p>
<p>Wahai Tuhanku, hamba-Mu yang penuh dosa ini, kini menghadap-Mu memohon ampunan.</p>
<p>Jika Engkau mengampuni, pantaslah karena Engkau Maha Pengampun.</p>
<p>Namun, jika Engkau menolak permohonan hamba, kepada siapa hamba berharap selain Engkau.</p>
</blockquote>
<hr>
<p><small><em>Sumber: Buku &ldquo;Seni Merayu Tuhan&rdquo;, Husein Ja&rsquo;far Al-Hadar</em></small></p>
]]></content></item><item><title>Suatu Cerita tentang Imam Abu Hanifah yang dimintai Petunjuk</title><link>https://budi.day/2023/06/suatu-cerita-tentang-imam-abu-hanifah-yang-dimintai-petunjuk/</link><pubDate>Wed, 07 Jun 2023 11:40:40 +0700</pubDate><guid>https://budi.day/2023/06/suatu-cerita-tentang-imam-abu-hanifah-yang-dimintai-petunjuk/</guid><description>~
Imam Abu Hanifah pernah didatangi seseorang yang lupa menaruh barang berharganya. Dia minta petunjuk kepada Abu Hanifah.
Lalu, Abu Hanifah bilang, &amp;ldquo;Nanti malam, kamu shalat sampai pagi!&amp;rdquo; Kemudian, malamnya orang itu pun shalat.
Namun, di tengah-tengah shalat, belum berkunjung pagi, dia ingat dimana meletakkan barang yang hilang itu. Dia pun kembali kepada Abu Hanifah, menyampaikan kabar bahwa barangnya sudah ditemukan.
Lalu, Abu Hanifah berkata, &amp;ldquo;Aku tahu setan takkan membiarkanmu khusyuk.</description><content type="html"><![CDATA[<figure class="normal"><img src="/uploads/2556.webp"
         alt="~"/><figcaption>
            <p>~</p>
        </figcaption>
</figure>

<p>Imam Abu Hanifah pernah didatangi seseorang yang lupa menaruh barang berharganya. Dia minta petunjuk kepada Abu Hanifah.</p>
<p>Lalu, Abu Hanifah bilang, <em>&ldquo;Nanti malam, kamu shalat sampai pagi!&rdquo;</em> Kemudian, malamnya orang itu pun shalat.</p>
<p>Namun, di tengah-tengah shalat, belum berkunjung pagi, dia ingat dimana meletakkan barang yang hilang itu. Dia pun kembali kepada Abu Hanifah, menyampaikan kabar bahwa barangnya sudah ditemukan.</p>
<p>Lalu, Abu Hanifah berkata, <em>&ldquo;Aku tahu setan takkan membiarkanmu khusyuk. Maka, setanlah yang membantu kamu menemukan barangmu.&rdquo;</em></p>
<hr>
<p>Cerita ini <em>plot twist</em> banget ga sih 😆</p>
<p>Tapi ada pelajaran yang bisa diambil dari cerita ini, bisa dibaca di bukunya Habib Jafar yang judulnya <em>&ldquo;Seni Merayu Tuhan&rdquo;</em>, cerita ini pun diambil dari buku tersebut.</p>
]]></content></item><item><title>Decolonize Palestine (decolonizepalestine.com)</title><link>https://budi.day/2022/11/decolonize-palestine/</link><pubDate>Sat, 05 Nov 2022 19:30:26 +0700</pubDate><guid>https://budi.day/2022/11/decolonize-palestine/</guid><description/><content type="html">
&lt;iframe src='https://decolonizepalestine.com/' title='Decolonize Palestine'
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 1;">
&lt;/iframe></content></item><item><title>Connect Google Domains to Netlify Site using Google Domains's DNS</title><link>https://budi.day/2021/05/connect-google-domains-with-netlify-site-using-google-dns/</link><pubDate>Sat, 08 May 2021 03:27:04 +0700</pubDate><guid>https://budi.day/2021/05/connect-google-domains-with-netlify-site-using-google-dns/</guid><description>Google Domains - DNS Google Domains&amp;rsquo;s DNS
Custom Domains - Netlify Site Custom Domains Netlify Site
More detail from Netlify&amp;rsquo;s docs</description><content type="html"><![CDATA[<h2 id="google-domains---dns">Google Domains - DNS</h2>
<figure class="normal"><img src="/uploads/google-domains-dns.webp"
         alt="Google Domains&amp;rsquo;s DNS"/><figcaption>
            <p>Google Domains&rsquo;s DNS</p>
        </figcaption>
</figure>

<h2 id="custom-domains---netlify-site">Custom Domains - Netlify Site</h2>
<figure class="normal"><img src="/uploads/netlify-custom-domain.webp"
         alt="Custom Domains Netlify Site"/><figcaption>
            <p>Custom Domains Netlify Site</p>
        </figcaption>
</figure>

<p>More detail from <a href="https://docs.netlify.com/domains-https/custom-domains/configure-external-dns/">Netlify&rsquo;s docs</a></p>
]]></content></item><item><title>Connection not Fully Secure (Disqus)</title><link>https://budi.day/2021/05/connection-not-fully-secure-disqus/</link><pubDate>Sun, 02 May 2021 03:27:04 +0700</pubDate><guid>https://budi.day/2021/05/connection-not-fully-secure-disqus/</guid><description>Connection not fully secure
I got some part of my site showing not fully secure as shown in the image above. After tracking the issue, I found this is because of Disqus. If you face the same issue, you can try this solution
Go to your Disqus account Click Setting Gear -&amp;gt; Admin Click Edit Settings -&amp;gt; Choose your site Click Advanced -&amp;gt; Disable Tracking Disable disqus tracking</description><content type="html"><![CDATA[<figure class="normal"><img src="/uploads/2021-05-02-not-fully-secure.webp"
         alt="Connection not fully secure"/><figcaption>
            <p>Connection not fully secure</p>
        </figcaption>
</figure>

<p>I got some part of my site showing <u><em><em>not fully secure</em></em></u> as shown in the image above. After tracking the issue, I found this is because of Disqus. If you face the same issue, you can try this solution</p>
<ol>
<li>Go to your Disqus account</li>
<li>Click Setting Gear -&gt; Admin</li>
<li>Click Edit Settings -&gt; Choose your site</li>
<li>Click Advanced -&gt; Disable Tracking</li>
</ol>
<figure class="normal"><img src="/uploads/2021-05-02-disable-tracking-disqus.webp"
         alt="Disable disqus tracking"/><figcaption>
            <p>Disable disqus tracking</p>
        </figcaption>
</figure>

]]></content></item><item><title>First Commit in 2021</title><link>https://budi.day/2021/01/first-commit-in-2021/</link><pubDate>Fri, 01 Jan 2021 17:27:04 +0700</pubDate><guid>https://budi.day/2021/01/first-commit-in-2021/</guid><description>Hello 2021 :) First commit in 2021</description><content type="html"><![CDATA[<h2 id="hello-2021-">Hello 2021 :)</h2>
<figure class="normal"><img src="/uploads/2021-01-01-first-commit.jpg"
         alt="First commit in 2021"/><figcaption>
            <p>First commit in 2021</p>
        </figcaption>
</figure>

]]></content></item><item><title>Thank you 2020 :)</title><link>https://budi.day/2020/12/thank-you-2020/</link><pubDate>Thu, 31 Dec 2020 21:41:21 +0700</pubDate><guid>https://budi.day/2020/12/thank-you-2020/</guid><description>#Page 366 of 366 Thank you 2020 :)</description><content type="html"><![CDATA[<h3 id="page-366-of-366">#Page 366 of 366</h3>
<!-- * Personal
    * [x] React Tictactoe
    * [x] Personal Web
    * [x] Covid-19
    * [ ] ~~Project Ideas~~

* Muslimapp
    * [ ] ~~Moslem Store~~

* Monocle Agency
    * [x] Imaya Label
    * [x] Machi & Partners
    * [ ] Mera Rasa

* Hubton Indonesia
    * [x] Floship
    * [x] Hope
    * [ ] SMPM 8 -->
<!-- <figure class="normal"><img src="/uploads/2020-12-31-thank-you-2020.png"
         alt="Thank you 2020 :)"/><figcaption>
            <p>Thank you 2020 :)</p>
        </figcaption>
</figure>
 -->
<figure class="normal"><img src="/uploads/2020-12-31-thank-you-2020-m.png"
         alt="Thank you 2020 :)"/><figcaption>
            <p>Thank you 2020 :)</p>
        </figcaption>
</figure>

]]></content></item><item><title>Started #100DaysOfCode Challenge :)</title><link>https://budi.day/2020/08/start-100-days-of-code-challenge/</link><pubDate>Thu, 20 Aug 2020 16:00:00 +0700</pubDate><guid>https://budi.day/2020/08/start-100-days-of-code-challenge/</guid><description>4 days ago I decided to join a challenge called #100DaysOfCode, the challenge is quite interesting for me so I decided to join in. The main rules of the challenge are code minimum an hour every day and tweet the progress on twitter with #100DaysOfCode hashtag for the next 100 days.
You can see detail information of the challenge on the official website.
See my progress on my git log or my twitter :)</description><content type="html"><![CDATA[<p>4 days ago I decided to join a challenge called #100DaysOfCode, the challenge is quite interesting for me so I decided to join in. The main rules of the challenge are <strong>code minimum an hour every day and tweet the progress on twitter with #100DaysOfCode hashtag for the next 100 days.</strong></p>
<p>You can see detail information of the challenge on the <a href="https://100daysofcode.com" title="Official Website #100DaysOfCode Challenge">official website</a>.</p>
<p>See my progress on <a href="https://github.com/budimanfajarf/100-days-of-code/blob/master/log.md" title="Git Log #100DaysOfCode">my git log</a> or <a href="https://twitter.com/budimanfajarf" title="Twitter budimanfajarf">my twitter</a> :)</p>
]]></content></item><item><title>Coronavirus COVID-19 Web App and RESTful API</title><link>https://budi.day/2020/07/coronavirus-covid19-web-application-restful-api/</link><pubDate>Wed, 15 Jul 2020 15:00:00 +0000</pubDate><guid>https://budi.day/2020/07/coronavirus-covid19-web-application-restful-api/</guid><description>Web Application A few days ago I&amp;rsquo;ve created a single page web application about coronavirus COVID-19 info, it&amp;rsquo;s created with Vue.js and apply skeleton loading. The data are fetched from Rest API I created before :)
Web App: covid19.budidev.com Repo: github.com/budimanfajarf/covid19 Restful API Before I build the web app, I build this Rest API first with Node.js. It&amp;rsquo;s consume data from another API, I calculate source data then add new data like percent, total data, etc, the goal is to create a simple API :)</description><content type="html"><![CDATA[<h2 id="web-application">Web Application</h2>
<p>A few days ago I&rsquo;ve created a single page web application about coronavirus COVID-19 info, it&rsquo;s created with <strong>Vue.js</strong> and apply skeleton loading. The data are fetched from Rest API I created before :)</p>

<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
  <iframe src="https://www.youtube.com/embed/pL7apH9dhlo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe>
</div>

<ul>
<li>Web App: <a href="https://covid19.budidev.com" title="Web App COVID-19 Info">covid19.budidev.com</a></li>
<li>Repo: <a href="https://github.com/budimanfajarf/covid19" title="Repository Web App COVID-19">github.com/budimanfajarf/covid19</a></li>
</ul>
<h2 id="restful-api">Restful API</h2>
<p>Before I build the web app, I build this Rest API first with <strong>Node.js</strong>. It&rsquo;s consume data from another API, I calculate source data then add new data like percent, total data, etc, the goal is to create a simple API :)</p>
<ul>
<li>Documentation: <a href="https://documenter.getpostman.com/view/11864120/T17DgUSe" title="Documentation COVID-19 RESTful API">documenter.getpostman.com/view/11864120/T17DgUSe</a></li>
<li>Repo: <a href="https://github.com/budimanfajarf/covid19-api" title="Repository COVID-19 RESTful API">github.com/budimanfajarf/covid19-api</a></li>
</ul>
<hr>
<p>See all my <a href="/dev" title="Dev / Project by budimanfajarf">dev/project 💻</a> :)</p>
]]></content></item><item><title>Setting Up Nginx to Run Multiple Node.js App on AWS EC2 Instance</title><link>https://budi.day/2020/06/setting-nginx-run-multiple-nodejs-aws-ec2-instance/</link><pubDate>Fri, 26 Jun 2020 07:30:40 +0700</pubDate><guid>https://budi.day/2020/06/setting-nginx-run-multiple-nodejs-aws-ec2-instance/</guid><description>Prerequisite Earlier before, if you&amp;rsquo;re following a post about install nginx on AWS EC2, you&amp;rsquo;ll have a server configuration file called like example.com, for me is api.budidev.com, it&amp;rsquo;s configured to listen default port 80, which is default port for HTTP connection.
And then if you&amp;rsquo;re following another post about secure HTTPS connection on nginx, the configuration file will be edited automatically by Certbot to configure HTTPS connection that listen on port 443, and it&amp;rsquo;s configured to redirect all HTTP traffic to secure HTTPS.</description><content type="html"><![CDATA[<h1 id="prerequisite">Prerequisite</h1>
<p>Earlier before, if you&rsquo;re following a post about <a href="/2020/06/install-nginx-server-block-domain-aws-ec2-instance" title="Install Nginx on AWS EC2">install nginx on AWS EC2</a>, you&rsquo;ll have a server configuration file called like <code><strong>example.com</strong></code>, for me is <code><strong>api.budidev.com</strong></code>, it&rsquo;s configured to listen default port 80, which is default port for HTTP connection.</p>
<p>And then if you&rsquo;re following another post about <a href="/2020/06/secure-https-connection-nginx-server-block-lets-encrypt-certbot" title="secure HTTPS connection on nginx]">secure HTTPS connection on nginx</a>, the configuration file will be edited automatically by Certbot to configure HTTPS connection that listen on port 443, and it&rsquo;s configured to redirect all HTTP traffic to secure HTTPS.</p>
<p>The end result of configuration file <code><strong>api.budidev.com</strong></code> look like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Nginx" data-lang="Nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">root</span> <span class="s">/var/www/api.budidev.com/html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">index</span> <span class="s">index.html</span> <span class="s">index.htm</span> <span class="s">index.nginx-debian.html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">try_files</span> <span class="nv">$uri</span> <span class="nv">$uri/</span> <span class="p">=</span><span class="mi">404</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">ipv6only=on</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_certificate</span> <span class="s">/etc/letsencrypt/live/api.budidev.com/fullchain.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_certificate_key</span> <span class="s">/etc/letsencrypt/live/api.budidev.com/privkey.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">include</span> <span class="s">/etc/letsencrypt/options-ssl-nginx.conf</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_dhparam</span> <span class="s">/etc/letsencrypt/ssl-dhparams.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">if</span> <span class="s">(</span><span class="nv">$host</span> <span class="p">=</span> <span class="s">api.budidev.com)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">return</span> <span class="mi">301</span> <span class="s">https://</span><span class="nv">$host$request_uri</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">return</span> <span class="mi">404</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div>
<hr>
<p>One more for prerequisite, if you&rsquo;re following previous post about <a href="/2020/06/install-nodejs-aws-ec2-keep-running-pm2" title="install node.js and make node.js app keep running">install node.js and make node.js app keep running</a>, you&rsquo;ll have a node.js app that running on some port, for me is port <code><strong>3000</strong></code>.</p>
<h1 id="update-apibudidevcom">Update api.budidev.com</h1>
<p>Before we begin to talk about run multiple node.js app, I&rsquo;ll update the configuration file to route HTTP and HTTPS connection to the Node.js app that running on port <code><strong>3000</strong></code>, so I can access Node.js app by navigating to <code><strong>https‎://api.budidev.com</strong></code>, and no needed to specify the port again, like <code><strong>https‎://api.budidev.com:3000</strong></code>.</p>
<p><a href="/2020/06/connect-aws-ec2-remote-ssh/" title="Connect to EC2 Instance">Connect to your instance</a> first, then open the configuration file:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-TermInfo" data-lang="TermInfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nano /etc/nginx/sites-available/api.budidev.com</span></span></span></code></pre></div></p>
<p>Update the file with the content below</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Nginx" data-lang="Nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">root</span> <span class="s">/var/www/api.budidev.com/html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">index</span> <span class="s">index.html</span> <span class="s">index.htm</span> <span class="s">index.nginx-debian.html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># --- UPDATE CONFIGURATION HERE ---
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># try_files $uri $uri/ =404;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:3000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_http_version</span> <span class="mi">1</span><span class="s">.1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Upgrade</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="s">&#39;upgrade&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_cache_bypass</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># ----------------------------------  
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">ipv6only=on</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_certificate</span> <span class="s">/etc/letsencrypt/live/api.budidev.com/fullchain.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_certificate_key</span> <span class="s">/etc/letsencrypt/live/api.budidev.com/privkey.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">include</span> <span class="s">/etc/letsencrypt/options-ssl-nginx.conf</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_dhparam</span> <span class="s">/etc/letsencrypt/ssl-dhparams.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">if</span> <span class="s">(</span><span class="nv">$host</span> <span class="p">=</span> <span class="s">api.budidev.com)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">return</span> <span class="mi">301</span> <span class="s">https://</span><span class="nv">$host$request_uri</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">return</span> <span class="mi">404</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div>
<p>Notice here that my configuration file name and my server_name is <code><strong>api.budidev.com</strong></code>, you should replace with your own like <code><strong>example.com</strong></code>, and notice too that I run node.js app on port <code><strong>3000</strong></code>, replace this with your own port that run node.js app, close and save after editing.</p>
<p>Test nginx configuration</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nginx -t</span></span></span></code></pre></div>
<p>If there aren’t any problems, restart nginx to enable changes</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> service nginx restart</span></span></span></code></pre></div>
<p>Now if you&rsquo;re going to your domain or subdomain name, for me is <code><strong>https://‎api.budidev.com</strong></code> <strong>without</strong> adding specific port like 3000, you should see node.js app show up:</p>
<figure class="normal"><img src="/uploads/2020-06-20-nginx-nodejs-01-api-budidev-com.webp"
         alt="api.budidev.com"/><figcaption>
            <p>api.budidev.com</p>
        </figcaption>
</figure>

<h1 id="run-multiple-nodejs-app">Run Multiple Node.js App</h1>
<p>I found 2 approach to run multiple node.js app in one server, you can choose which one you&rsquo;re preferred.</p>
<h2 id="first-approuch">First Approuch</h2>
<p>The first approach is, you can update and add a new <code><strong>location</strong></code> on your configuration file before, for example, I&rsquo;ll edit my configuration file <code><strong>api.budidev.com</strong></code></p>
<ol>
<li>
<p>Create and run a new node.js app on some port, for example port <code><strong>3001</strong></code>, <em>look at a post about <a href="/2020/06/install-nodejs-aws-ec2-keep-running-pm2/" title="install node.js and make node.js app keep running">install node.js and make node.js app keep running</a> for detail</em></p>
</li>
<li>
<p>Update <code><strong>api.budidev.com</strong></code></p>
</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Nginx" data-lang="Nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">root</span> <span class="s">/var/www/api.budidev.com/html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">index</span> <span class="s">index.html</span> <span class="s">index.htm</span> <span class="s">index.nginx-debian.html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:3000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_http_version</span> <span class="mi">1</span><span class="s">.1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Upgrade</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="s">&#39;upgrade&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_cache_bypass</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1"># --- ANOTHER NODE.JS APP HERE ---
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">location</span> <span class="s">/app2/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_pass</span> <span class="s">http://127.0.0.1:3001/</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_http_version</span> <span class="mi">1</span><span class="s">.1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Upgrade</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="s">&#39;upgrade&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">proxy_cache_bypass</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>  
</span></span><span class="line"><span class="cl">  <span class="c1"># ---------------------------------
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:443</span> <span class="s">ssl</span> <span class="s">ipv6only=on</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_certificate</span> <span class="s">/etc/letsencrypt/live/api.budidev.com/fullchain.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_certificate_key</span> <span class="s">/etc/letsencrypt/live/api.budidev.com/privkey.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">include</span> <span class="s">/etc/letsencrypt/options-ssl-nginx.conf</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="kn">ssl_dhparam</span> <span class="s">/etc/letsencrypt/ssl-dhparams.pem</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">if</span> <span class="s">(</span><span class="nv">$host</span> <span class="p">=</span> <span class="s">api.budidev.com)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">return</span> <span class="mi">301</span> <span class="s">https://</span><span class="nv">$host$request_uri</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">return</span> <span class="mi">404</span><span class="p">;</span> <span class="c1"># managed by Certbot
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span></span></span></code></pre></div>
<p>In this approuch, the second node.js app will run on route <code><strong>/app2</strong></code>, for me is <code><strong>https://‎api.budidev.com/app2</strong></code></p>
<h2 id="second-approuch">Second Approuch</h2>
<p>The second approach is, you can run another your node.js app on new domain or subdomain, for example:</p>
<ol>
<li>Create domain or subdomain called <code><strong>sub.example.com</strong></code> using A Record and pointing this to IP Address of your AWS EC2 instance</li>
<li>Create and run a new node.js app on some port, for example port <code><strong>3001</strong></code>, <em>look at a post about <a href="/2020/06/install-nodejs-aws-ec2-keep-running-pm2/" title="install node.js and make node.js app keep running">install node.js and make node.js app keep running</a> for detail</em></li>
<li>Create new nginx server block configuration file called <code><strong>sub.example.com</strong></code>, and use <code><strong>proxy_pass</strong></code> to route to your node.js app on port <code><strong>3001</strong></code>, <a href="#update-api-budidev-com" title="example above">like the example above</a></li>
<li>Secure your domain or subdomain using Let&rsquo;s Encrypt, <em>look at a post about <a href="/2020/06/secure-https-connection-nginx-server-block-lets-encrypt-certbot/" title="secure https connection in nginx">secure https connection in nginx</a> for detail</em></li>
</ol>
]]></content></item><item><title>How to Install Node.js on AWS EC2 and Make Node.js App Keep Running</title><link>https://budi.day/2020/06/install-nodejs-aws-ec2-keep-running-pm2/</link><pubDate>Thu, 25 Jun 2020 07:22:57 +0700</pubDate><guid>https://budi.day/2020/06/install-nodejs-aws-ec2-keep-running-pm2/</guid><description>In this post, I will show you how to install Node.js and use PM2 as process manager to make node.js app keep running, I use my AWS EC2 instance of Ubuntu 18.04 for the installation, you can follow this post to launch an EC2 instance or you can use your local computer for the installation.
If you use an AWS EC2 instance to follow this post, you have to connect to instance first and add Custom TCP at port 3000 in inbound rules, this port is used for test to run node.</description><content type="html"><![CDATA[<p>In this post, I will show you how to install Node.js and use PM2 as process manager to make node.js app keep running, I use my AWS EC2 instance of Ubuntu 18.04 for the installation, you can follow this post to <a href="/2020/06/launch-amazon-ec2-instance-ubuntu-server-18-04/" title="Launch EC2 Instance">launch an EC2 instance</a> or you can use your local computer for the installation.</p>
<p>If you use an AWS EC2 instance to follow this post, you have to <a href="/2020/06/connect-aws-ec2-remote-ssh/" title="Connect to EC2 Instance">connect to instance</a> first and add Custom TCP at port 3000 in inbound rules, this port is used for test to run node.js app.</p>
<h1 id="install-nodejs-using-nvm">Install Node.js using NVM</h1>
<h2 id="install-nvm">Install NVM</h2>
<p>If you&rsquo;ve connected to your instance or use your local computer, now time to install node.js. In this post I&rsquo;ll install node.js using nvm, nvm is a version manager for node.js.</p>
<p>The reasons I install node.js using nvm are that I can easily switch node.js version that currently running to another version, and I can install global packages <code><strong>npm i -g</strong></code> without doing sudo.</p>
<p>Run the following commands in a terminal to <strong>install</strong> or <strong>update</strong> nvm</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">curl</span><span class="na"> -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh </span><span class="p">|</span><span class="na"> bash</span></span></span></code></pre></div>
<p>The command above will download a script and runs it. The script clones the nvm repository to <code>~/.nvm</code>, and attempts to add the source lines to the correct profile file (<code>~/.bash_profile</code>, <code>~/.zshrc</code>, <code>~/.profile</code>, or <code>~/.bashrc</code>).</p>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-01-install-nvm.webp"
         alt="Install nvm"/><figcaption>
            <p>Install nvm</p>
        </figcaption>
</figure>

<p>You can find the <a href="https://github.com/nvm-sh/nvm#install--update-script" title="github nvm">updated version of nvm here</a></p>
<p>Run the command below to check that nvm was successfully installed</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">nvm</span><span class="na"> --version</span></span></span></code></pre></div>
<p>The terminal will show <code>Command &rsquo;nvm&rsquo; not found</code> as the code has been added to your profile but hasn’t run yet</p>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-02-nvm-not-found.webp"
         alt="nvm not found"/><figcaption>
            <p>nvm not found</p>
        </figcaption>
</figure>

<p>Just close the currently opened terminal and launch a new terminal and run <code><strong>nvm &ndash;version</strong></code> again</p>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-02-nvm-version.webp"
         alt="nvm --version"/><figcaption>
            <p>nvm &ndash;version</p>
        </figcaption>
</figure>

<h2 id="install-nodejs">Install Node.js</h2>
<p>To install node.js using nvm, you can use <code><strong>nvm install</strong></code> node to install the latest version of node, or use <code><strong>nvm install 6.14.4</strong></code> to install a specific version of node, or use <code><strong>nvm install &ndash;lts</strong></code> to install the latest LTS version of node.</p>
<p>NVM will install Node.js include with NPM (Node Package Manager), see the <a href="https://github.com/nvm-sh/nvm" title="github nvm">complete guide to use nvm here</a>.</p>
<p>Install the latest LTS version of Node.js</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">nvm</span><span class="na"> install --lts</span></span></span></code></pre></div>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-03-nvm-install-lts.webp"
         alt="nvminstall --ltsn"/><figcaption>
            <p>nvm install &ndash;lts</p>
        </figcaption>
</figure>

<p>Check the installed version of Node.js</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">node</span><span class="na"> --version</span></span></span></code></pre></div>
<p>Check the installed version of NPM</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">npm</span><span class="na"> --version</span></span></span></code></pre></div>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-04-node-npm-version.webp"
         alt="node npm --version"/><figcaption>
            <p>node npm &ndash;version</p>
        </figcaption>
</figure>

<h1 id="run-example-nodejs-app">Run Example Node.js App</h1>
<p>Node.js has successfully installed in your system, now time to run some node.js application. I&rsquo;ll run an application that cloning from <a href="https://github.com/budimanfajarf/node-hello-world" title="budimanfajarf hello-world">my github repository</a>, the app is quite simple, it just a &lsquo;Hello World&rsquo; app, it use just for test that node.js running correctly.</p>
<p>The main code <code><strong>app.js</strong></code> of this repository looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">port</span> <span class="o">=</span> <span class="mi">3000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Hello World!&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">port</span><span class="p">,</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`Example app listening at http://localhost:</span><span class="si">${</span><span class="nx">port</span><span class="si">}</span><span class="sb">`</span><span class="p">))</span></span></span></code></pre></div>
<p>Clone the repository</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> clone https://github.com/budimanfajarf/node-hello-world.git</span></span></span></code></pre></div>
<p>Change directory to <code><strong>node-hello-world</strong></code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">cd</span><span class="na"> node-hello-world</span></span></span></code></pre></div>
<p>Install packages using npm</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">npm</span><span class="na"> install</span></span></span></code></pre></div>
<p>Run Node.js app</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">node</span><span class="na"> app.js</span></span></span></code></pre></div>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-05-nodejs-app.webp"
         alt="node npm --version"/><figcaption>
            <p>node npm &ndash;version</p>
        </figcaption>
</figure>

<p>Open a browser and navigate to <code><strong>localhost:3000</strong></code> if you&rsquo;re using a local computer, or navigate to <code><strong>public-dns-or-ip-address:3000</strong></code> if you&rsquo;re using an AWS EC2 Instance.</p>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-06-hello-world.webp"
         alt="node npm --version"/><figcaption>
            <p>node npm &ndash;version</p>
        </figcaption>
</figure>

<h1 id="make-nodejs-app-keep-running">Make Node.js App Keep Running</h1>
<h2 id="install-pm2">Install PM2</h2>
<p>The app will run as long as you open the terminal, but when you close the terminal or press <code><strong>Ctrl-C</strong></code>, the app will stop running. To make node.js app keep running, we can use a process manager called PM2, find more information <a href="https://www.npmjs.com/package/pm2" title="NPM PM2">about PM2 here</a>.</p>
<p>First, stop the <code><strong>app.js</strong></code> running before by press <code><strong>Ctrl-C</strong></code></p>
<p>Install PM2 globally using npm</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">npm</span><span class="na"> install pm2 -g</span></span></span></code></pre></div>
<p>Start Node.js app using PM2</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> start ~/node-hello-world/app.js</span></span></span></code></pre></div>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-07-pm2-start.webp"
         alt="pm2 start app.js"/><figcaption>
            <p>pm2 start app.js</p>
        </figcaption>
</figure>

<p>Now even if you close the terminal, the app will keep running and can access using a browser on a url like <code><strong>localhost:3000</strong></code> if you use a local computer, or <code><strong>public-dns-or-ip-address:3000</strong></code> if you use an AWS EC2 instance.</p>
<h2 id="configure-startup">Configure Startup</h2>
<p>When you reboot your server, the app won&rsquo;t automatically be running, we can set up startup configuration by generating startup script using pm2.</p>
<p>To generate the startup script, use the following command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> startup</span></span></span></code></pre></div>
<p>Copy the generated script and hit enter to run it</p>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-08-pm2-startup-script.webp"
         alt="pm2 startup script"/><figcaption>
            <p>pm2 startup script</p>
        </figcaption>
</figure>

<p>Save the configuration</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> save</span></span></span></code></pre></div>
<figure class="normal"><img src="/uploads/2020-06-19-nodejs-aws-09-pm2-save.webp"
         alt="pm2 save"/><figcaption>
            <p>pm2 save</p>
        </figcaption>
</figure>

<p>Now when you reboot your server, the pm2 will automatically running and start node.js app! :)</p>
<p>If you want to remove the startup configuration, the steps are similar, generate unstartup script with the command below</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> unstartup</span></span></span></code></pre></div>
<p><strong>Copy</strong> and <strong>run</strong> the generated script, then save the configuration with <code><strong>pm2 save</strong></code>.</p>
<h2 id="useful-pm2-commands">Useful PM2 Commands</h2>
<p>List all running apps:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> list</span></span></span></code></pre></div>
<p>Managing apps:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> stop &lt;app_name</span><span class="p">|</span><span class="na">namespace</span><span class="p">|</span><span class="na">id</span><span class="p">|</span><span class="na">&#39;all&#39;</span><span class="p">|</span><span class="na">json_conf&gt;</span></span></span></code></pre></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> restart &lt;app_name</span><span class="p">|</span><span class="na">namespace</span><span class="p">|</span><span class="na">id</span><span class="p">|</span><span class="na">&#39;all&#39;</span><span class="p">|</span><span class="na">json_conf&gt;</span></span></span></code></pre></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> delete &lt;app_name</span><span class="p">|</span><span class="na">namespace</span><span class="p">|</span><span class="na">id</span><span class="p">|</span><span class="na">&#39;all&#39;</span><span class="p">|</span><span class="na">json_conf&gt;</span></span></span></code></pre></div>
<p>Details on a specific app:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> describe &lt;id</span><span class="p">|</span><span class="na">app_name&gt;</span></span></span></code></pre></div>
<p>Monitor logs, custom metrics, apps information:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">pm2</span><span class="na"> monit</span></span></span></code></pre></div>
<p>Find more info about PM2 on <a href="https://www.npmjs.com/package/pm2" title="NPM PM2">npmjs</a> or <a href="https://pm2.keymetrics.io/" title="Keymetrics PM2">keymetrics</a></p>
]]></content></item><item><title>How to Secure HTTPS Connection in Nginx Server with Let's Encrypt</title><link>https://budi.day/2020/06/secure-https-connection-nginx-server-block-lets-encrypt-certbot/</link><pubDate>Wed, 24 Jun 2020 00:01:44 +0700</pubDate><guid>https://budi.day/2020/06/secure-https-connection-nginx-server-block-lets-encrypt-certbot/</guid><description>Let’s Encrypt is a Certificate Authority (CA) that provides an easy way to obtain and install free TLS/SSL certificates, thereby enabling encrypted HTTPS on web servers. It simplifies the process by providing a software client, Certbot, that attempts to automate most (if not all) of the required steps [ref].
If you following preview post about How to Install Nginx and Setting Up Server Block, you&amp;rsquo;ll have an nginx configuration file called like example.</description><content type="html"><![CDATA[<p><code><strong>Let’s Encrypt</strong></code> is a Certificate Authority (CA) that provides an easy way to obtain and install free TLS/SSL certificates, thereby enabling encrypted HTTPS on web servers. It simplifies the process by providing a software client, <code><strong>Certbot</strong></code>, that attempts to automate most (if not all) of the required steps <a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04">[ref]</a>.</p>
<p>If you following preview post about <a href="/2020/06/install-nginx-server-block-domain-aws-ec2-instance/" title="How to Install Nginx and Setting Up Server Block">How to Install Nginx and Setting Up Server Block</a>, you&rsquo;ll have an nginx configuration file called like <code><strong>example.com</strong></code>, for me is <code><strong>api.budidev.com</strong></code>. The file should be saved in directory <code><strong>/etc/nginx/sites-available</strong></code> and linking to <code><strong>/etc/nginx/sites-enabled</strong></code>.</p>
<p>In this post, I&rsquo;ll show you how to enable HTTPS (SSL/TLS) connection for domain or subdomain in nginx server block configuration file. The configuration will automatically generated using Certbot by Let&rsquo;s Encrypt.</p>
<p>You can see the official instruction by Let&rsquo;s Encrypt to <a href="https://certbot.eff.org/" title="Certbot">using Certbot here</a>.</p>
<p>First of all, you have to connect to the server, if you use AWS EC2 instance as a web server, you can follow this post to <a href="/2020/06/connect-aws-ec2-remote-ssh/" title="Connect to EC2 Instance">connect to EC2 instance</a></p>
<h2 id="add-certbot-ppa-and-install-certbot">Add Certbot PPA and Install Certbot</h2>
<p>Add the Certbot PPA to list of repositories with the commands below</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt-get install software-properties-common</span></span></span></code></pre></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> add-apt-repository universe</span></span></span></code></pre></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> add-apt-repository ppa:certbot/certbot</span></span></span></code></pre></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt-get update</span></span></span></code></pre></div>
<p>Install Certbot with the command below</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt-get install certbot python3-certbot-nginx</span></span></span></code></pre></div>
<h2 id="get-an-ssl-certificate-and-automatically-configure">Get an SSL Certificate and Automatically Configure</h2>
<p>Run the command below to get a certificate and let Certbot edit Nginx configuration automatically</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> certbot --nginx</span></span></span></code></pre></div>
<p>If this is the first time running certbot, you&rsquo;ll be prompted to enter an email address and agree to the terms of service</p>
<figure class="normal"><img src="/uploads/2020-06-18-https-nginx-01-certbot.webp"
         alt="Certbot Email and Agreements"/><figcaption>
            <p>Certbot Email and Agreements</p>
        </figcaption>
</figure>

<p>Choose the domain or subdomain you want to activate HTTPS</p>
<figure class="normal"><img src="/uploads/2020-06-18-https-nginx-02-certbot.webp"
         alt="Certbot Choose Nginx Configuration File"/><figcaption>
            <p>Certbot Choose Nginx Configuration File</p>
        </figcaption>
</figure>

<p>Choose the options you preffer, choose option 1 so you can access web server via HTTP and HTTPS, choose option 2 to redirecting HTTP to HTTPS</p>
<figure class="normal"><img src="/uploads/2020-06-18-https-nginx-03-certbot.webp"
         alt="Certbot Choose Redirect or No"/><figcaption>
            <p>Certbot Choose Redirect or No</p>
        </figcaption>
</figure>

<p>If everything works fine, certbot will print a success message with the important notes like the example below</p>
<figure class="normal"><img src="/uploads/2020-06-18-https-nginx-04-certbot.webp"
         alt="Certbot Success Install Certificates"/><figcaption>
            <p>Certbot Success Install Certificates</p>
        </figcaption>
</figure>

<p>Now the certificates are installed, try to access web server in a browser using <code><strong>https</strong></code> connection, for me is <code><strong>https://‎api.budidev.com</strong></code></p>
<figure class="normal"><img src="/uploads/2020-06-18-https-nginx-05-success-https.webp"
         alt="Success Secure HTTPS Connection"/><figcaption>
            <p>Success Secure HTTPS Connection</p>
        </figcaption>
</figure>

<h2 id="test-automatic-renewal">Test automatic renewal</h2>
<p>The Certbot packages on your system come with a cron job or systemd timer that will renew your certificates automatically before they expire. You will not need to run Certbot again unless you change your configuration [<a href="https://certbot.eff.org/" title="Certbot">ref</a>].</p>
<p>You can test automatic renewal for your certificates by running this command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> certbot renew --dry-run</span></span></span></code></pre></div>
<figure class="normal"><img src="/uploads/2020-06-18-https-nginx-06-certbot-renew.webp"
         alt="Certbot Success Test Renew Certificate"/><figcaption>
            <p>Certbot Success Test Renew Certificate</p>
        </figcaption>
</figure>

]]></content></item><item><title>How to Install Nginx and Setting Up Server Block to Domain on AWS EC2</title><link>https://budi.day/2020/06/install-nginx-server-block-domain-aws-ec2-instance/</link><pubDate>Tue, 23 Jun 2020 14:29:57 +0700</pubDate><guid>https://budi.day/2020/06/install-nginx-server-block-domain-aws-ec2-instance/</guid><description>Before beginning this guide, first you must have an EC2 Instance, you can follow this post to launch an EC2 instance.
In this post, I use EC2 Instance of Ubuntu Server 18.04, and access the instance using SSH connection in a terminal of my Ubuntu Desktop, follow this post to connect to EC2 instance.
Configure security group of your instance to add HTTP &amp;amp; HTTPS connection in inbound traffic, you can follow this post to configure security group.</description><content type="html"><![CDATA[<p>Before beginning this guide, first you must have an EC2 Instance, you can follow this post to <a href="/2020/06/launch-amazon-ec2-instance-ubuntu-server-18-04/" title="Launch EC2 Instance">launch an EC2 instance</a>.</p>
<p>In this post, I use EC2 Instance of Ubuntu Server 18.04, and access the instance using SSH connection in a terminal of my Ubuntu Desktop, follow this post to <a href="/2020/06/connect-aws-ec2-remote-ssh/" title="Connect to EC2 Instance">connect to EC2 instance</a>.</p>
<p>Configure security group of your instance to add HTTP &amp; HTTPS connection in inbound traffic, you can follow this post to <a href="/2020/06/configure-security-group-aws-ec2-instance/" title="Configure Security Group EC2 Instance">configure security group</a>.</p>
<p>Prepare a domain or subdomain, added using A Record that pointing to public IP4 address of your instance, either default IP4 address or Elastic IP4 address.</p>
<h1 id="install-nginx">Install Nginx</h1>
<p>Update Packages</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt update</span></span></span></code></pre></div>
<p>Install Nginx</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt install nginx</span></span></span></code></pre></div>
<p>Check Nginx Status</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> service nginx status</span></span></span></code></pre></div>
<p>Open your instance detail and copy public DNS or public IP Address</p>
<figure class="normal"><img src="/uploads/2020-06-17-nginx-ec2-01-public-ip-dns.webp"
         alt="EC2 Public DNS and Public IP Address"/><figcaption>
            <p>EC2 Public DNS and Public IP Address</p>
        </figcaption>
</figure>

<p>Open a browser and paste it to check that Nginx successfully installed</p>
<figure class="normal"><img src="/uploads/2020-06-17-nginx-ec2-01-welcome-nginx.webp"
         alt="Nginx Welcome Page"/><figcaption>
            <p>Nginx Welcome Page</p>
        </figcaption>
</figure>

<h1 id="setting-up-nginx-server-block">Setting Up Nginx Server Block</h1>
<p>When using the Nginx web server, server blocks (similar to virtual hosts in Apache) can be used to encapsulate configuration details and host more than one domain from a single server <a href="https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04" title="Install Nginx on Ubuntu 18.04">[ref]</a>.</p>
<p>In this post, I will set up my subdomain called <code><strong>api.budidev.com</strong></code>, but you should <strong>replace this with your own domain or subdomain name</strong>.</p>
<h2 id="create-directory-and-indexhtml-sample-file">Create Directory and index.html Sample File</h2>
<p>Create directory for <code><strong>api.budidev.com</strong></code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> mkdir -p /var/www/api.budidev.com/html</span></span></span></code></pre></div>
<p>Assign ownership of the directory to current login user</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> chown -R $USER:$USER /var/www/api.budidev.com/html</span></span></span></code></pre></div>
<p>Create a sample <code><strong>index.html</strong></code> using nano</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">nano</span><span class="na"> /var/www/api.budidev.com/html/index.html</span></span></span></code></pre></div>
<p>Fill the <code><strong>index.html</strong></code> like the example below</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Welcome to api.budidev.com<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>Success!  The api.budidev.com server block is working!<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></span></span></code></pre></div>
<h2 id="create-new-nginx-server-block">Create New Nginx Server Block</h2>
<p>Create new configuration server block file called <code><strong>api.budidev.com</strong></code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nano /etc/nginx/sites-available/api.budidev.com</span></span></span></code></pre></div>
<p>Fill the content like the example below</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Nginx" data-lang="Nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">listen</span> <span class="s">[::]:80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">root</span> <span class="s">/var/www/api.budidev.com/html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kn">index</span> <span class="s">index.html</span> <span class="s">index.htm</span> <span class="s">index.nginx-debian.html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">server_name</span> <span class="s">api.budidev.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="kn">try_files</span> <span class="nv">$uri</span> <span class="nv">$uri/</span> <span class="p">=</span><span class="mi">404</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
<p>Enable the <code><strong>api.budidev.com</strong></code> configuration file by creating a link from it to the sites-enabled directory</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> ln -s /etc/nginx/sites-available/api.budidev.com /etc/nginx/sites-enabled/</span></span></span></code></pre></div>
<h2 id="configure-nginx">Configure Nginx</h2>
<p>To avoid a possible hash bucket memory problem that can arise from adding additional server names, it is necessary to adjust a single value in the <code><strong>/etc/nginx/nginx.conf</strong></code> file <a href="https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04" title="Install Nginx Ubuntu 18.04">[ref]</a>.</p>
<p>Open <code><strong>nginx.conf</strong></code> file</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nano /etc/nginx/nginx.conf</span></span></span></code></pre></div>
<p>Find the <code><strong>server_names_hash_bucket_size</strong></code> and remove the <code><strong>#</strong></code> symbol to uncomment the line</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Nginx" data-lang="Nginx"><span class="line"><span class="cl"><span class="k">http</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">server_names_hash_bucket_size</span> <span class="mi">64</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
<p>Test Nginx configuration</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nginx -t</span></span></span></code></pre></div>
<p>If there aren’t any problems, restart Nginx to enable changes</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> service nginx restart</span></span></span></code></pre></div>
<p>Nginx should now serve your domain or subdomain. You can test this using browser by navigating to <code><strong>http:‎//your-domain-subdomain.com</strong></code>, for me is <code><strong>http://‎api.budidev.com</strong></code></p>
<figure class="normal"><img src="/uploads/2020-06-17-nginx-ec2-02-success-server-block.webp"
         alt="Success Nginx Server Block"/><figcaption>
            <p>Success Nginx Server Block</p>
        </figcaption>
</figure>

]]></content></item><item><title>Configure Security Group in AWS EC2 Instance</title><link>https://budi.day/2020/06/configure-security-group-aws-ec2-instance/</link><pubDate>Mon, 22 Jun 2020 23:35:22 +0700</pubDate><guid>https://budi.day/2020/06/configure-security-group-aws-ec2-instance/</guid><description>A security group acts as a virtual firewall for your instance to control incoming and outgoing traffic. Inbound rules control the incoming traffic to your instance, and outbound rules control the outgoing traffic from your instance [ref].
You can easily configure security group of your instance via EC2 Dashboard.
Select an instance, then look at Description tab, click the link like example below to navigate to security group
Security Group in Instance Detail</description><content type="html"><![CDATA[<p>A security group acts as a virtual firewall for your instance to control incoming and outgoing traffic. Inbound rules control the incoming traffic to your instance, and outbound rules control the outgoing traffic from your instance <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html" title="EC2 Security Group">[ref]</a>.</p>
<p>You can easily configure security group of your instance via <a href="https://console.aws.amazon.com/ec2/v2" title="AWS EC2 Dashboard">EC2 Dashboard</a>.</p>
<p>Select an instance, then look at <code><strong>Description</strong></code> tab, click the link like example below to navigate to security group</p>
<figure class="normal"><img src="/uploads/2020-06-16-security-group-01-instance-detail.webp"
         alt="Security Group in Instance Detail"/><figcaption>
            <p>Security Group in Instance Detail</p>
        </figcaption>
</figure>

<p>Click the Security group ID link like example below to see detail inbound and outbond traffic of your instance</p>
<figure class="normal"><img src="/uploads/2020-06-16-security-group-02-security-group-id.webp"
         alt="Security Group in Instance Detail"/><figcaption>
            <p>Security Group in Instance Detail</p>
        </figcaption>
</figure>

<p>When you launch an instance and don&rsquo;t configure the security group, the default rules will look like this</p>
<figure class="normal"><img src="/uploads/2020-06-16-security-group-03-default-inbound.webp"
         alt="Default Inbound Traffic"/><figcaption>
            <p>Default Inbound Traffic</p>
        </figcaption>
</figure>

<figure class="normal"><img src="/uploads/2020-06-16-security-group-03-default-outbound.webp"
         alt="Default Outbound Traffic"/><figcaption>
            <p>Default Outbound Traffic</p>
        </figcaption>
</figure>

<p>To edit rules of inbound or outbound traffic, click <code><strong>Edit</strong></code> button like example below</p>
<figure class="normal"><img src="/uploads/2020-06-16-security-group-03-button-edit.webp"
         alt="Security Group in Instance Detail"/><figcaption>
            <p>Security Group in Instance Detail</p>
        </figcaption>
</figure>

<figure class="normal"><img src="/uploads/2020-06-16-security-group-04-edit-inbound-rules.webp"
         alt="Security Group in Instance Detail"/><figcaption>
            <p>Example Inbound Rules</p>
        </figcaption>
</figure>

<p>In the example above, I added new rules HTTP (port 80), HTTPS (port 443) and Custom TCP (port 3000) to inbound rules.</p>
<p>The following inbound rules allow HTTP and HTTPS access from any IP address. This is for setup my instance to be a <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-web-server," title="AWS Web Server Rules">web server</a>, so I can access like this:</p>
<ul>
<li><a href="http://aws-public-dns-or-example-domain.com">http://aws-public-dns-or-example-domain.com</a></li>
<li><a href="https://aws-public-dns-or-example-domain.com">https://aws-public-dns-or-example-domain.com</a></li>
</ul>
<p>Then I added custom TCP (port 3000), so I can access web server like this:</p>
<ul>
<li><a href="http://aws-public-dns-or-example-domain.com:3000">http://aws-public-dns-or-example-domain.com:3000</a></li>
<li><a href="https://aws-public-dns-or-example-domain.com:3000">https://aws-public-dns-or-example-domain.com:3000</a></li>
</ul>
<p>The custom TCP above is not for production, I use this to test Node.js application running on Port 3000.</p>
<p>Save new added rules by click orange button <code><strong>Save rules</strong></code></p>
]]></content></item><item><title>Access Amazon Elastic Compute Cloud (EC2) Remotely via SSH</title><link>https://budi.day/2020/06/connect-aws-ec2-remote-ssh/</link><pubDate>Mon, 22 Jun 2020 13:09:43 +0700</pubDate><guid>https://budi.day/2020/06/connect-aws-ec2-remote-ssh/</guid><description>Go to EC2 Dashboard then navigate to Intances
EC2 Dashboard
Select the instance then click Connect button
Instance Detail
A window pops up will show up with a few info about how to connect to an instance
How to Connect to Instance
NOTE: The key-pair example-key.pem is generated when you first time launch an instance
Command to apply chmod 400 to key-pair
chmod 400 /path/to/example-key.pem Command to connect to instance via SSH</description><content type="html"><![CDATA[<p>Go to <a href="https://console.aws.amazon.com/ec2/v2" title="AWS EC2 Dashboard">EC2 Dashboard</a> then navigate to <code><strong>Intances</strong></code></p>
<figure class="normal"><img src="/uploads/2020-06-16-connect-instance-01-ec2-dashboard.webp"
         alt="EC2 Dashboard"/><figcaption>
            <p>EC2 Dashboard</p>
        </figcaption>
</figure>

<p>Select the instance then click <code><strong>Connect</strong></code> button</p>
<figure class="normal"><img src="/uploads/2020-06-16-connect-instance-02-instance.webp"
         alt="Instance Detail"/><figcaption>
            <p>Instance Detail</p>
        </figcaption>
</figure>

<p>A window pops up will show up with a few info about how to connect to an instance</p>
<figure class="normal"><img src="/uploads/2020-06-16-connect-instance-03-connect-info.webp"
         alt="How to Connect to Instance"/><figcaption>
            <p>How to Connect to Instance</p>
        </figcaption>
</figure>

<p><em><strong>NOTE:</strong> The key-pair <code><strong>example-key.pem</strong></code> is generated when you first time launch an instance</em></p>
<hr>
<p>Command to apply <code><strong>chmod 400</strong></code> to key-pair</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">chmod</span><span class="na"> 400 /path/to/example-key.pem</span></span></span></code></pre></div>
<p>Command to connect to instance via SSH</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">ssh</span><span class="na"> -i &#34;/path/to/example-key.pem&#34; user@public-dns-example.com</span></span></span></code></pre></div>
<p>In this example, I use terminal ubuntu desktop to connect to EC2 instance</p>
<figure class="normal"><img src="/uploads/2020-06-16-connect-instance-04-terminal-ubuntu.webp"
         alt="Terminal Ubuntu"/><figcaption>
            <p>Terminal Ubuntu Desktop</p>
        </figcaption>
</figure>

<p>Successfully connect to instance</p>
<figure class="normal"><img src="/uploads/2020-06-16-connect-instance-05-success-connect.webp"
         alt="Successfully Connect to Instance"/><figcaption>
            <p>Successfully Connect to Instance</p>
        </figcaption>
</figure>

]]></content></item><item><title>Let's Try to Launch Amazon EC2 Instance (Ubuntu Server 18.04)</title><link>https://budi.day/2020/06/launch-amazon-ec2-instance-ubuntu-server-18-04/</link><pubDate>Sun, 21 Jun 2020 22:59:20 +0700</pubDate><guid>https://budi.day/2020/06/launch-amazon-ec2-instance-ubuntu-server-18-04/</guid><description>About Amazon EC2 Amazon Elastic Compute Cloud (Amazon EC2) is a web service that provides secure, resizable compute capacity in the cloud. It is designed to make web-scale cloud computing easier for developers. Amazon EC2’s simple web service interface allows you to obtain and configure capacity with minimal friction. It provides you with complete control of your computing resources and lets you run on Amazon’s proven computing environment [ref].
In short, Amazon EC2 is a Virtual Server in the Cloud.</description><content type="html"><![CDATA[<h1 id="about-amazon-ec2">About Amazon EC2</h1>
<p>Amazon Elastic Compute Cloud (Amazon EC2) is a web service that provides secure, resizable compute capacity in the cloud. It is designed to make web-scale cloud computing easier for developers. Amazon EC2’s simple web service interface allows you to obtain and configure capacity with minimal friction. It provides you with complete control of your computing resources and lets you run on Amazon’s proven computing environment <a href="https://aws.amazon.com/ec2/" title="Amazon EC2">[ref]</a>.</p>
<blockquote>
<p>In short, Amazon EC2 is a Virtual Server in the Cloud.</p>
</blockquote>
<h1 id="launch-amazon-ec2-instance">Launch Amazon EC2 Instance</h1>
<p>First of all, you must have an AWS account, you can follow this post to <a href="/2020/06/how-create-aws-account-free-tier-offers/" title="Create an AWS account">create an AWS account</a>.</p>
<p>Go and Sign In to <a href="https://console.aws.amazon.com/" title="AWS Management Console">AWS Management Console</a></p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-01-sign-in.webp"
         alt="AWS Console Sign In"/><figcaption>
            <p>AWS Console Sign In</p>
        </figcaption>
</figure>

<p>Find services then choose EC2</p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-02-console.webp"
         alt="AWS Console EC2"/><figcaption>
            <p>AWS Console EC2</p>
        </figcaption>
</figure>

<p>Now you should be redirected to <a href="https://console.aws.amazon.com/ec2/v2" title="AWS EC2 Dashboard">EC2 Dashboard</a>.</p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-03-ec2-dashboard.webp"
         alt="AWS EC2 Dashboard"/><figcaption>
            <p>EC2 Dashboard</p>
        </figcaption>
</figure>

<p>To launch a new EC2 Instance, Click orange button <code><strong>Launch Instance</strong></code></p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-03-launch-instance.webp"
         alt="Launch Instance Button"/><figcaption>
            <p>Launch Instance</p>
        </figcaption>
</figure>

<h2 id="step-1-choose-an-amazon-machine-image-ami">Step 1: Choose an Amazon Machine Image (AMI)</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step1-ami.webp"
         alt="Step 1: AMI"/><figcaption>
            <p>Step 1: AMI</p>
        </figcaption>
</figure>

<p>Choose <a href="https://en.wikipedia.org/wiki/Amazon_Machine_Image" title="Amazon Machine Image">AMI</a> you preferred, check <code><strong>Free tier only</strong></code> to show only AMI that covered around <a href="https://aws.amazon.com/free/" title="Free Tier Offers by AWS">Free Tier Offers by AWS</a>. I&rsquo;ll select Ubuntu Server 18.04 that I preferred.</p>
<p>Click <code><strong>Select</strong></code> button to continue</p>
<h2 id="step-2-choose-an-instance-type">Step 2: Choose an Instance Type</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step2-instance-type.webp"
         alt="Step 2: Instance Type"/><figcaption>
            <p>Step 2: Instance Type</p>
        </figcaption>
</figure>

<p>Leave to default settings then click <code><strong>Next: Configure Instance Detail</strong></code></p>
<h2 id="step-3-configure-instance-detail">Step 3: Configure Instance Detail</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step3-instance-detail.webp"
         alt="Step 3: Instance Detail"/><figcaption>
            <p>Step 3: Instance Detail</p>
        </figcaption>
</figure>

<p>Leave to default settings then click <code><strong>Next: Add Storage</strong></code></p>
<h2 id="step-4-add-storage">Step 4: Add Storage</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step4-storage.webp"
         alt="Step 4: Storage"/><figcaption>
            <p>Step 4: Storage</p>
        </figcaption>
</figure>

<p>Leave to default settings or you can adjust the size (Max of Free Tier is 30GB), then click <code><strong>Next: Add Tags</strong></code></p>
<h2 id="step-5-add-tags">Step 5: Add Tags</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step5-tags.webp"
         alt="Step 5: Tags"/><figcaption>
            <p>Step 5: Tags</p>
        </figcaption>
</figure>

<p>Leave to default settings then click <code><strong>Next: Configure Security Group</strong></code></p>
<h2 id="step-6-configure-security-group">Step 6: Configure Security Group</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step6-security-group.webp"
         alt="Step 6: Security Group"/><figcaption>
            <p>Step 6: Security Group</p>
        </figcaption>
</figure>

<p>Leave to default settings then click <code><strong>Review and Launch</strong></code></p>
<p><em>I&rsquo;ve created a post about <a href="/2020/06/configure-security-group-aws-ec2-instance/" title="AWS EC2 Security Group">configure security group in EC2</a></em>.</p>
<h2 id="step-7-review-instance-launch">Step 7: Review Instance Launch</h2>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-04-step7-review-instance.webp"
         alt="Step 7: Review Instance"/><figcaption>
            <p>Step 7: Review Instance</p>
        </figcaption>
</figure>

<p>Verify the whole settings you set up before then click <code><strong>Launch</strong></code></p>
<p>A window pops up will asking you to select an existing key-pair or create a new key-pair. If you haven’t created a key pair before then create a new one, then download it to your local computer. The key-pair is using to connect the Instance via SSH Client.</p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-05-key-pair.webp"
         alt="Key Pair"/><figcaption>
            <p>Key Pair</p>
        </figcaption>
</figure>

<p>After you download the key-pair, then click <code><strong>Launch Instances</strong></code></p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-06-launch-status.webp"
         alt="Success Launch Instance"/><figcaption>
            <p>Success Launch Instance</p>
        </figcaption>
</figure>

<p>Congrats! You are successfully launching an EC2 Instance :)</p>
<p>Click <code><strong>View Instances</strong></code> to see detail instance you launched</p>
<figure class="normal"><img src="/uploads/2020-06-15-amazon-ec2-07-instance.webp"
         alt="Instance Detail"/><figcaption>
            <p>Instance Detail</p>
        </figcaption>
</figure>

<p>You may have to wait a few minutes until the status of the instance change from <code><strong>pending</strong></code> to <code><strong>running</strong></code>, just wait :)</p>
]]></content></item><item><title>How to Create an AWS Account to Get Free Tier Offers</title><link>https://budi.day/2020/06/how-create-aws-account-free-tier-offers/</link><pubDate>Sun, 21 Jun 2020 16:20:31 +0700</pubDate><guid>https://budi.day/2020/06/how-create-aws-account-free-tier-offers/</guid><description>Earlier before I&amp;rsquo;ve posted an article about How to Install LEMP Stack On Ubuntu AWS EC2. To launch an AWS EC2 Instance, first you have to own an AWS account, so in this post, I will show you how to create an AWS account then you will have access to Free Tier Offers by AWS.
First, go to AWS Sign Up Portal, fill the required fields, then click Continue
AWS Sign Up Portal</description><content type="html"><![CDATA[<p>Earlier before I&rsquo;ve posted an article about <a href="/2020/06/install-lemp-stack-linux-nginx-mysql-php-ubuntu-18-04-aws-ec2/" title="How to Install LEMP Stack On Ubuntu AWS EC2">How to Install LEMP Stack On Ubuntu AWS EC2</a>. To launch an AWS EC2 Instance, first you have to own an AWS account, so in this post, I will show you how to create an AWS account then you will have access to <a href="https://aws.amazon.com/free/" title="Free Tier Offers by AWS">Free Tier Offers by AWS</a>.</p>
<p>First, go to <a href="https://portal.aws.amazon.com/billing/signup" title="AWS Sign Up Portal">AWS Sign Up Portal</a>, fill the required fields, then click <code><strong>Continue</strong></code></p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-01-signup-form.png"
         alt="AWS Sign Up Portal"/><figcaption>
            <p>AWS Sign Up Portal</p>
        </figcaption>
</figure>

<p>After that you will be asked for contact information, fill the required fields, then click <code><strong>Create Account and Continue</strong></code></p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-02-contact-info.png"
         alt="AWS Sign Up Contact Information"/><figcaption>
            <p>Contact Information</p>
        </figcaption>
</figure>

<p>The next step is payment information, you can use Debit or Credit Card which accepted by AWS like Visa, Master Card, etc.</p>
<p>Noted here you will be <strong><u>charged $1 USD/EUR</u></strong> by AWS as verification to ensure the card is valid.</p>
<p>Fill the payment information, then click <code><strong>Verify and Add</strong></code></p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-03-payment-info.png"
         alt="AWS Sign Up Payment Information"/><figcaption>
            <p>Payment Information</p>
        </figcaption>
</figure>

<p>Next, before you can use your AWS account, you must add a phone number and verify it using verification code that will send via SMS.</p>
<p>Fill the phone number and the security check, then click <code><strong>Send SMS</strong></code></p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-04-confirm-account.png"
         alt="AWS Confirm Identity"/><figcaption>
            <p>Confirm Identity</p>
        </figcaption>
</figure>

<p>Check your phone, enter the verification code, then click <code><strong>Verify Code</strong></code></p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-05-verification-code.png"
         alt="AWS Verification Code"/><figcaption>
            <p>Verification Code</p>
        </figcaption>
</figure>

<p>Select a Support Plan you preferred, you can choose Basic Plan for this</p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-06-select-plan.png"
         alt="AWS Select Support Plan"/><figcaption>
            <p>Support Plan</p>
        </figcaption>
</figure>

<p>Congrats! now you have an AWS account :)</p>
<figure class="normal"><img src="/uploads/compressed/2020-06-14-aws-account-07-welcome.png"
         alt="AWS Welcome Page"/><figcaption>
            <p>Welcome to AWS</p>
        </figcaption>
</figure>

<p>You may have to wait a few minutes until you can sign in to <a href="https://console.aws.amazon.com/" title="AWS Management Console">AWS Management Console</a>.</p>
<p>Find more information about <a href="https://aws.amazon.com/free/" title="Free Tier Offers by AWS">AWS Free Tier Offers here</a>.</p>
]]></content></item><item><title>Git Reset to Previous Commit</title><link>https://budi.day/2020/06/git-reset-previous-commit/</link><pubDate>Thu, 11 Jun 2020 07:23:55 +0700</pubDate><guid>https://budi.day/2020/06/git-reset-previous-commit/</guid><description>Find The Commit Log all commit history
git log Then copy the previous hash commit you want to reset to it, commit &amp;lt;hash&amp;gt;.
Hard Reset Once you have the hash, do hard reset
git reset --hard &amp;lt;hash&amp;gt; Example:
git reset --hard 7e9c66afa4e45a3cc0bc6d56e67e0faea7aa3b72 Update: Use &amp;ndash;soft instead &amp;ndash;hard so you can get the staged changes :)
Example:
git reset --soft 7e9c66afa4e45a3cc0bc6d56e67e0faea7aa3b72 Push it Then force push to remote branch
git push -f &amp;lt;remote&amp;gt; &amp;lt;branch&amp;gt; Example:</description><content type="html"><![CDATA[<h2 id="find-the-commit">Find The Commit</h2>
<p>Log all commit history</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> log</span></span></span></code></pre></div>
<p>Then copy the previous hash commit you want to reset to it, <code>commit <strong>&lt;hash&gt;</strong></code>.</p>
<br/>
<h2 id="hard-reset">Hard Reset</h2>
<p>Once you have the hash, do hard reset</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> reset --hard &lt;hash&gt;</span></span></span></code></pre></div>
<p>Example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> reset --hard 7e9c66afa4e45a3cc0bc6d56e67e0faea7aa3b72</span></span></span></code></pre></div>
<br/>
<blockquote>
<p><strong>Update:</strong> Use <code>&ndash;soft</code> instead <code>&ndash;hard</code> so you can get the staged changes :)</p>
</blockquote>
<blockquote>
<p>Example:</p>
</blockquote>
<blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> reset --soft 7e9c66afa4e45a3cc0bc6d56e67e0faea7aa3b72</span></span></span></code></pre></div>
</blockquote>
<br/>
<h2 id="push-it">Push it</h2>
<p>Then force push to remote branch</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> push -f &lt;remote&gt; &lt;branch&gt;</span></span></span></code></pre></div>
<p>Example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">git</span><span class="na"> push -f origin master</span></span></span></code></pre></div>
]]></content></item><item><title>How to Install LEMP Stack (Linux, Nginx, MySQL, PHP) on Ubuntu 18.04 AWS EC2</title><link>https://budi.day/2020/06/install-lemp-stack-linux-nginx-mysql-php-ubuntu-18-04-aws-ec2/</link><pubDate>Tue, 09 Jun 2020 06:30:16 +0700</pubDate><guid>https://budi.day/2020/06/install-lemp-stack-linux-nginx-mysql-php-ubuntu-18-04-aws-ec2/</guid><description>AWS LEMP Stack
In this post I will show you how to install LEMP Stack on AWS EC2 Instance
L = Linux (Ubuntu 18.04)
E = Engine X / Nginx (1.14)
M = MySQL (5.7)
P = PHP (7.2)
Creating AWS EC2 Instance First of all, you must have an AWS account, you can register here and get 12 months of Free Tier access from Amazon Web Service (AWS).</description><content type="html"><![CDATA[<figure class="normal"><img src="/uploads/compressed/aws-lemp-stack.jpg"
         alt="AWS LEMP Stack"/><figcaption>
            <p>AWS LEMP Stack</p>
        </figcaption>
</figure>

<p>In this post I will show you how to install LEMP Stack on AWS EC2 Instance</p>
<ul>
<li>
<p>L = Linux (Ubuntu 18.04)</p>
</li>
<li>
<p>E = Engine X / Nginx (1.14)</p>
</li>
<li>
<p>M = MySQL (5.7)</p>
</li>
<li>
<p>P = PHP (7.2)</p>
</li>
</ul>
<h1 id="creating-aws-ec2-instance">Creating AWS EC2 Instance</h1>
<p>First of all, you must have an AWS account, you can register <a href="https://portal.aws.amazon.com/billing/signup" title="AWS SignUp">here</a> and get 12 months of Free Tier access from Amazon Web Service (AWS).</p>
<p>After registering an AWS account, sign in to <a href="https://aws.amazon.com/console/" title="AWS Console">AWS Console</a> then choose EC2 Service, Launch new Instance then follow the steps with this options:</p>
<ul>
<li>
<p><strong>Amazon Machine Image (AMI):</strong> Ubuntu Server 18.04 LTS</p>
</li>
<li>
<p><strong>Instance Type:</strong> General purpose | t2.micro</p>
</li>
<li>
<p><strong>Instance Details:</strong> Leave to default settings</p>
</li>
<li>
<p><strong>Storage:</strong> Leave to default settings or you can adjust the size (Max of Free Tier is 30GB)</p>
</li>
<li>
<p><strong>Tags:</strong> Add your tags or you can skip this step</p>
</li>
<li>
<p><strong>Security Group:</strong> Create a new security group with the rules below</p>
</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">Type</th>
<th style="text-align:left">Protocol</th>
<th style="text-align:left">Port Range</th>
<th style="text-align:left">Source</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">SSH</td>
<td style="text-align:left">TCP</td>
<td style="text-align:left">22</td>
<td style="text-align:left">Custom - 0.0.0.0/0</td>
</tr>
<tr>
<td style="text-align:left">HTTP</td>
<td style="text-align:left">TCP</td>
<td style="text-align:left">80</td>
<td style="text-align:left">Anywhere - 0.0.0.0/0, ::/0</td>
</tr>
</tbody>
</table>
<ul>
<li>
<p><strong>Review Instance Launch:</strong> Verify the settings then click Launch</p>
</li>
<li>
<ul>
<li>A window pops up will asking you to select an existing key-pair or create a new key-pair. If you haven&rsquo;t created a key pair before then create a new one, then <code><strong>download</strong></code> it to your local computer. The <code><strong>key-pair</strong></code> is using to <a href="/2020/06/remote-ssh-cheat-sheet" title="Connecting to Remote SSH">connect the Instance via SSH Client</a>.</li>
</ul>
</li>
</ul>
<h1 id="connecting-to-aws-ec2-instance">Connecting to AWS EC2 Instance</h1>
<p>To see how to connect to your Instance, go to <a href="https://console.aws.amazon.com/ec2/v2" title="AWS EC2 Dashboard">AWS EC2 Dashboard</a>, navigate to <code><strong>Running Instances</strong></code>, select the Instance of Ubuntu 18.04 that launched before, then click <code><strong>Connect</strong></code> button. You will see a few info about how to connect to AWS EC2 Instance.</p>
<p>In this example, I use terminal on Ubuntu desktop as SSH Client to connect to AWS EC2 Instance.</p>
<ul>
<li>
<p>Move the <code><strong>key-pair</strong></code> file you download before to <code><strong>~/.ssh</strong></code> directory</p>
</li>
<li>
<p>Open a terminal then apply <code><strong>chmod 400</strong></code> to the file</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">chmod</span><span class="na"> 400 ~/.ssh/your-key.pem</span></span></span></code></pre></div>
<ul>
<li>In a terminal, connect to your instance using Public DNS with the key-pair as identify file, Example:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">ssh</span><span class="na"> -i &#34;~/.ssh/your-key.pem&#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com</span></span></span></code></pre></div>
<p>To see your <code><strong>Public DNS</strong></code>  or <code><strong>Public IP Address</strong></code>, go to <a href="https://console.aws.amazon.com/ec2/v2" title="AWS EC2 Dashboard">AWS EC2 Dashboard</a>, select your instance then see in <code><strong>Description Section</strong></code>.</p>
<h1 id="installing-nginx-server">Installing Nginx Server</h1>
<p>After you successfully connect to your instance, now you can managing the instance as you want. To Setup the LEMP Stack, first update your instance packages</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt update</span></span></span></code></pre></div>
<p>Then install the Nginx Server</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt install nginx</span></span></span></code></pre></div>
<p>Open a browser then go to your Public DNS or Public IP Address of your instance to check that Nginx successfully installed.</p>
<p><code><strong>htpps://your-public-DNS-or-IP-address</strong></code></p>
<figure class="normal"><img src="/uploads/compressed/nginx-welcome-page.png"
         alt="Nginx Welcome Page"/><figcaption>
            <p>Nginx Welcome Page</p>
        </figcaption>
</figure>

<h1 id="installing-mysql">Installing MySQL</h1>
<p>The next thing to do is installing MySQL, use this command to install it</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt install mysql-server</span></span></span></code></pre></div>
<p>Configure MySQL with this command</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> mysql_secure_installation</span></span></span></code></pre></div>
<h1 id="installing-php">Installing PHP</h1>
<p>Install <code><strong>php-fpm</strong></code>, a stands for “fastCGI process manager” to tell Nginx to pass PHP requests to this software for processing</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt install php-fpm</span></span></span></code></pre></div>
<p>Install <code><strong>php-mysql</strong></code> to allow PHP communicate with database backend</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> apt install php-mysql</span></span></span></code></pre></div>
<h1 id="configuring-nginx-to-use-php">Configuring Nginx to Use PHP</h1>
<p>Now the LEMP Stack are installed, but we have to configure Nginx to use PHP processor for dynamic content.</p>
<p>In this example, I will edit the <code><strong>default</strong></code> configuration server block of Nginx</p>
<p>First, backup the default configuration file</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak</span></span></span></code></pre></div>
<p>Open default configuration file using nano</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nano /etc/nginx/sites-available/default</span></span></span></code></pre></div>
<p>Fill with the content bellow</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Nginx" data-lang="Nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">root</span> <span class="s">/var/www/html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">index</span> <span class="s">index.php</span> <span class="s">index.html</span> <span class="s">index.nginx-debian.html</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">server_name</span> <span class="s">_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="kn">try_files</span> <span class="nv">$uri</span> <span class="nv">$uri/</span> <span class="p">=</span><span class="mi">404</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kn">location</span> <span class="p">~</span> <span class="sr">\.php</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="kn">include</span> <span class="s">snippets/fastcgi-php.conf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="kn">fastcgi_pass</span> <span class="s">unix:/var/run/php/php7.2-fpm.sock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kn">location</span> <span class="p">~</span> <span class="sr">/\.ht</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="kn">deny</span> <span class="s">all</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
<p>Create <code><strong>info.php</strong></code> file to test PHP</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> nano /var/www/html/info.php</span></span></span></code></pre></div>
<p>Fill with the content bellow</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="nx">phpinfo</span><span class="p">();</span></span></span></code></pre></div>
<p>Restart Nginx</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">sudo</span><span class="na"> service nginx restart</span></span></span></code></pre></div>
<p>Open a browser then go to <code><strong>htpps://your-public-DNS-or-IP-address/info.php</strong></code></p>
<p>If everything works fine you should see PHP info page like this</p>
<figure class="normal"><img src="/uploads/compressed/php-info-page.png"
         alt="PHP Info Page"/><figcaption>
            <p>PHP Info Page</p>
        </figcaption>
</figure>

]]></content></item><item><title>Remote SSH Cheat Sheet - Using Key</title><link>https://budi.day/2020/06/remote-ssh-cheat-sheet/</link><pubDate>Mon, 08 Jun 2020 11:48:50 +0700</pubDate><guid>https://budi.day/2020/06/remote-ssh-cheat-sheet/</guid><description>Connecting to Remote Server Format: ssh -i &amp;#34;/directory/your-key.pem&amp;#34; user@your-domain.com
Example: ssh -i &amp;#34;~/.ssh/budi.pem&amp;#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com
Copy File from Remote Server to Local Format: scp -i &amp;#34;/directory/your-key.pem&amp;#34; user@your-domain.com:/directory/server/example.txt /directory/local
Example: scp -i &amp;#34;~/.ssh/budi.pem&amp;#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com:/etc/nginx/nginx.conf ~/Downloads
Copy Folder from Remote Server to Local Format: scp -r -i &amp;#34;/directory/your-key.pem&amp;#34; user@your-domain.com:/directory/server/example /directory/local
Example: scp -r -i &amp;#34;~/.ssh/budi.pem&amp;#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com:/etc/nginx ~/Downloads
VSCode Configuration File Format: Host &amp;lt;your-domain.com&amp;gt; or &amp;lt;name&amp;gt; User &amp;lt;user-name&amp;gt; HostName &amp;lt;your-domain.com&amp;gt; IdentityFile &amp;lt;your-key.pem&amp;gt;
Example: Host aws-ubuntu User ubuntu HostName ec2-13-229-132-71.</description><content type="html"><![CDATA[<h2 id="connecting-to-remote-server">Connecting to Remote Server</h2>
<p>Format:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">ssh</span><span class="na"> -i &#34;/directory/your-key.pem&#34; user@your-domain.com</span></span></span></code></pre></div></p>
<p>Example:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">ssh</span><span class="na"> -i &#34;~/.ssh/budi.pem&#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com</span></span></span></code></pre></div></p>
<br/>
<h2 id="copy-file-from-remote-server-to-local">Copy File from Remote Server to Local</h2>
<p>Format:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">scp</span><span class="na"> -i &#34;/directory/your-key.pem&#34; user@your-domain.com:/directory/server/example.txt /directory/local</span></span></span></code></pre></div></p>
<p>Example:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">scp</span><span class="na"> -i &#34;~/.ssh/budi.pem&#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com:/etc/nginx/nginx.conf ~/Downloads</span></span></span></code></pre></div></p>
<br/>
<h2 id="copy-folder-from-remote-server-to-local">Copy Folder from Remote Server to Local</h2>
<p>Format:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">scp</span><span class="na"> -r -i &#34;/directory/your-key.pem&#34; user@your-domain.com:/directory/server/example /directory/local</span></span></span></code></pre></div></p>
<p>Example:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Terminfo" data-lang="Terminfo"><span class="line"><span class="cl"><span class="nt">scp</span><span class="na"> -r -i &#34;~/.ssh/budi.pem&#34; ubuntu@ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com:/etc/nginx ~/Downloads</span></span></span></code></pre></div></p>
<br/>
<h2 id="vscode-configuration-file">VSCode Configuration File</h2>
<p>Format:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Host <span class="p">&lt;</span><span class="nt">your-domain.com</span><span class="p">&gt;</span> or <span class="p">&lt;</span><span class="nt">name</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    User <span class="p">&lt;</span><span class="nt">user-name</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    HostName <span class="p">&lt;</span><span class="nt">your-domain.com</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    IdentityFile <span class="p">&lt;</span><span class="nt">your-key.pem</span><span class="p">&gt;</span></span></span></code></pre></div></p>
<p>Example:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">Host aws-ubuntu
</span></span><span class="line"><span class="cl">    User ubuntu
</span></span><span class="line"><span class="cl">    HostName ec2-13-229-132-71.ap-southeast-1.compute.amazonaws.com
</span></span><span class="line"><span class="cl">    IdentityFile ~/.ssh/budi.pem</span></span></code></pre></div></p>
]]></content></item><item><title>Completed APIs and Microservices Certification</title><link>https://budi.day/2020/05/apis-microservices/</link><pubDate>Fri, 29 May 2020 10:56:08 +0700</pubDate><guid>https://budi.day/2020/05/apis-microservices/</guid><description>I&amp;rsquo;ve completed APIs and Microservices Certification from freeCodeCamp.org :)
Detail Project: /dev/apis-microservices/</description><content type="html"><![CDATA[<p>I&rsquo;ve completed APIs and Microservices Certification from <a href="https://www.freecodecamp.org" title="freeCodeCamp">freeCodeCamp.org</a> :)</p>
<blockquote>
<p>Detail Project: <a href="/dev/apis-microservices/">/dev/apis-microservices/</a></p>
</blockquote>
<p><img src="/uploads/compressed/freecodecamp-org-certification-budimanfajarf-apis-and-microservices-2020-05-29.png" alt="Certificate"></p>
]]></content></item><item><title>Check if a User Has Scrolled to the Bottom of Page Using Javascript</title><link>https://budi.day/2020/05/javascript-check-user-scrolled-bottom-page/</link><pubDate>Sat, 16 May 2020 05:04:19 +0700</pubDate><guid>https://budi.day/2020/05/javascript-check-user-scrolled-bottom-page/</guid><description>You can use this script to check if a user has scrolled to the bottom of page, for example to show header, show navigation/menu, show button &amp;ldquo;back to top&amp;rdquo;, etc.
window.addEventListener(&amp;#39;scroll&amp;#39;, function (event) { if (document.documentElement.scrollHeight &amp;lt;= window.pageYOffset + window.innerHeight) { alert(&amp;#39;You are at the bottom of page!&amp;#39;); } }); For live example, scroll to the bottom of this page then you will see the header of this website slide up.</description><content type="html"><![CDATA[<p>You can use this script to check if a user has scrolled to the bottom of page, for example to show header, show navigation/menu, show button &ldquo;back to top&rdquo;, etc.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;scroll&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">.</span><span class="nx">scrollHeight</span> <span class="o">&lt;=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">pageYOffset</span> <span class="o">+</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">)</span>  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;You are at the bottom of page!&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span></span></span></code></pre></div>
<p>For live example, scroll to the bottom of this page then you will see the header of this website slide up.</p>
]]></content></item><item><title>How to Redirect Default Netlify Subdomain to Custom Domain</title><link>https://budi.day/2020/05/redirect-default-netlify-subdomain-to-custom-domain/</link><pubDate>Fri, 01 May 2020 04:25:15 +0700</pubDate><guid>https://budi.day/2020/05/redirect-default-netlify-subdomain-to-custom-domain/</guid><description>When you add custom domain to your netlify app, the [your].netlify.app not automatically redirect to your custom domain.
To redirect default netlify subdomain to your custom domain, add new file _redirects and save to the root of your website, then fill the _redirects file with the code below.
# Redirect default Netlify subdomain to primary domain https://[your].netlify.app/* https://[your-domain].com/:splat 301! # Example: https://budi.netlify.app/* https://budidev.com/:splat 301! In Hugo, save _redirects file to static folder.</description><content type="html"><![CDATA[<p>When you add custom domain to your netlify app, the [your].netlify.app not automatically redirect to your custom domain.</p>
<p>To redirect default netlify subdomain to your custom domain, add new file <code>_redirects</code> and save to the root of your website, then fill the <code>_redirects</code> file with the code below.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># Redirect default Netlify subdomain to primary domain
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl">https://[your].netlify.app/* https://[your-domain].com/:splat 301!
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Example: https://budi.netlify.app/* https://budidev.com/:splat 301!</span></span></code></pre></div>
<p>In Hugo, save <code>_redirects</code> file to <code>static</code> folder.</p>
]]></content></item><item><title>CSS or JavaScript in Hugo not Rendering when Preview Deploy on Netlify</title><link>https://budi.day/2020/04/css-or-javascript-in-hugo-not-rendering-when-preview-deploy-on-netlify/</link><pubDate>Tue, 14 Apr 2020 23:16:15 +0000</pubDate><guid>https://budi.day/2020/04/css-or-javascript-in-hugo-not-rendering-when-preview-deploy-on-netlify/</guid><description>When you make changes in your Hugo website either that is template changes or create new content, of course, you want to see the preview before going to publish.
Netlify has feature to see your preview website before publishing, you can get the link of your preview website after you successfully deploy your website to Netlify, like this:
![preview link deployed Hugo site](https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot from 2020-05-10 06-36-04.png &amp;ldquo;preview link deployed Hugo site&amp;rdquo;)</description><content type="html"><![CDATA[<p>When you make changes in your Hugo website either that is template changes or create new content, of course, you want to see the preview before going to publish.</p>
<p>Netlify has feature to see your preview website before publishing, you can get the link of your preview website after you successfully deploy your website to Netlify, like this:</p>
<p>![preview link deployed Hugo site](<a href="https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot">https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot</a> from 2020-05-10 06-36-04.png &ldquo;preview link deployed Hugo site&rdquo;)</p>
<p>If you click the link preview deploy, you will be redirected to the preview site that automatically generated by Netlify. The link will be like: <a href="https://5eb160f537052400067fc948--budi.netlify.app/" title="https://5eb160f537052400067fc948--budi.netlify.app/">https://5eb160f537052400067fc948&ndash;budi.netlify.app/</a></p>
<hr>
<p>![/uploads/Screenshot from 2020-05-10 06-53-55.png](<a href="https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot">https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot</a> from 2020-05-10 06-53-55.png &ldquo;preview&rdquo;)</p>
<p>See the example my preview site above, It looks like some CSS file not rendering correctly, but when I publish my deployed site, the CSS is rendering correctly. So, what&rsquo;s the problem?</p>
<p>After I debug my codes and doing trying errors for a few times, I got the problem. The problem is about to generate a URL in Hugo template.</p>
<p>Here&rsquo;s the code to get and genate resource some SCSS file in Hugo.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$custom</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.Get</span><span class="w"> </span><span class="s">&#34;scss/custom.scss&#34;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">resources</span><span class="na">.ExecuteAsTemplate</span><span class="w"> </span><span class="s">&#34;css/custom.css&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">toCSS</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">minify</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">fingerprint</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$custom</span><span class="na">.Permalink</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">absURL</span><span class="w">  </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="cp">{{</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;integrity=%q&#34;</span><span class="w"> </span><span class="nx">$custom</span><span class="na">.Data.Integrity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeHTMLAttr</span><span class="w"> </span><span class="cp">}}</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;</span></span></span></code></pre></div>
<p>The <code>absURL</code>(absolute URL) will generate url with format: <code>baseURL+url</code>, example like: <code>https://budidev.com/css/custom.css</code>.</p>
<p>That&rsquo;s why the CSS not rendering correctly because the baseURL of preview site is not the same with baseURL that configure in config.toml file.</p>
<p>So, instead using <code>absURL</code>, change this to <code>relURL</code>(relative URL), it&rsquo;s will generate url with format <code>/+url</code>, example like: <code>/css/custom.css</code></p>
<p>Here&rsquo;s the code after changed:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$custom</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.Get</span><span class="w"> </span><span class="s">&#34;scss/custom.scss&#34;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">resources</span><span class="na">.ExecuteAsTemplate</span><span class="w"> </span><span class="s">&#34;css/custom.css&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">toCSS</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">minify</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">fingerprint</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$custom</span><span class="na">.Permalink</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">relURL</span><span class="w">  </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="cp">{{</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;integrity=%q&#34;</span><span class="w"> </span><span class="nx">$custom</span><span class="na">.Data.Integrity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeHTMLAttr</span><span class="w"> </span><span class="cp">}}</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;</span></span></span></code></pre></div>
<p>Then if everything going well, the preview site should looks good now.</p>
<p>![/uploads/Screenshot from 2020-05-10 07-48-23.png](<a href="https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot">https://app.forestry.io/sites/f6db1ngltadquw/body-media//uploads/Screenshot</a> from 2020-05-10 07-48-23.png)</p>
<hr>
<p>You can try the same thing when failed to generate some JavaScript file, for example:</p>
<p><strong>Before edited:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$myTypeit</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.Get</span><span class="w"> </span><span class="s">&#34;js/my-typeit.js&#34;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">resources</span><span class="na">.ExecuteAsTemplate</span><span class="w"> </span><span class="s">&#34;js/my-typeit.js&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">minify</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">fingerprint</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$myTypeit</span><span class="na">.Permalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="cp">{{</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;integrity=%q&#34;</span><span class="w"> </span><span class="nx">$myTypeit</span><span class="na">.Data.Integrity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeHTMLAttr</span><span class="w"> </span><span class="cp">}}</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
<p><strong>After edited:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="nx">$myTypeit</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">resources</span><span class="na">.Get</span><span class="w"> </span><span class="s">&#34;js/my-typeit.js&#34;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">minify</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">fingerprint</span><span class="w"> </span><span class="cp">-}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$myTypeit</span><span class="na">.Permalink</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">relURL</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span> <span class="cp">{{</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;integrity=%q&#34;</span><span class="w"> </span><span class="nx">$myTypeit</span><span class="na">.Data.Integrity</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">safeHTMLAttr</span><span class="w"> </span><span class="cp">}}</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>
]]></content></item><item><title>Getting Errors Order Taxonomies when Deploy Hugo Site to Netlify</title><link>https://budi.day/2020/04/getting-errors-order-taxonomies-when-deploy-hugo-site-to-netlify/</link><pubDate>Sat, 11 Apr 2020 19:28:12 +0000</pubDate><guid>https://budi.day/2020/04/getting-errors-order-taxonomies-when-deploy-hugo-site-to-netlify/</guid><description>A few days ago I got errors when deploy my blog (Hugo site) to Netlify.
Errors Here&amp;rsquo;s the pieces of errors:
... ... 8:41:49 AM: ERROR 2020/05/03 01:41:49 render of &amp;quot;taxonomyTerm&amp;quot; failed: &amp;quot;/opt/build/repo/layouts/tags/terms.html:15:25&amp;quot;: execute of template failed: template: tags/terms.html:15:25: executing &amp;quot;main&amp;quot; at &amp;lt;.Page.Permalink&amp;gt;: can't evaluate field Page in type hugolib.OrderedTaxonomyEntry 8:41:49 AM: Total in 179 ms 8:41:49 AM: Error: Error building site: failed to render pages: render of &amp;quot;taxonomyTerm&amp;quot; failed: &amp;quot;/opt/build/repo/layouts/_default/terms.</description><content type="html"><![CDATA[<p>A few days ago I got errors when deploy my blog (Hugo site) to Netlify.</p>
<h1 id="errors">Errors</h1>
<p>Here&rsquo;s the pieces of errors:</p>
<pre><code>...
...
8:41:49 AM: ERROR 2020/05/03 01:41:49 render of &quot;taxonomyTerm&quot; failed: &quot;/opt/build/repo/layouts/tags/terms.html:15:25&quot;: execute of template failed: template: tags/terms.html:15:25: executing &quot;main&quot; at &lt;.Page.Permalink&gt;: can't evaluate field Page in type hugolib.OrderedTaxonomyEntry
8:41:49 AM: Total in 179 ms
8:41:49 AM: Error: Error building site: failed to render pages: render of &quot;taxonomyTerm&quot; failed: &quot;/opt/build/repo/layouts/_default/terms.html:15:20&quot;: execute of template failed: template: _default/terms.html:15:20: executing &quot;main&quot; at &lt;.Page.Permalink&gt;: can't evaluate field Page in type hugolib.OrderedTaxonomyEntry
...
...
8:41:49 AM: Error running command: Build script returned non-zero exit code: 255
8:41:49 AM: Failing build: Failed to build site
8:41:49 AM: failed during stage 'building site': Build script returned non-zero exit code: 255
8:41:49 AM: Finished processing build request in 14.990296865s
</code></pre>
<p>So, as usual, I open a new tab in the browser to find solutions on the internet, and then after a while, I found an article from the official Hugo website, here&rsquo;s the link: <a href="https://gohugo.io/templates/taxonomy-templates/" title="Hugo taxonomy templates">Hugo taxonomy templates</a>.</p>
<h1 id="reason-errors">Reason Errors</h1>
<p>After reading the article, I found the reason why I got errors when I deploy my site to Netlify, code below the reason why I getting the errors:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="na">.Data.Terms.Alphabetical</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Page.Permalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Page.Title</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="cp">{{</span><span class="w"> </span><span class="na">.Count</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span></span></span></code></pre></div>
<p>Order Taxonomies with the approach above is <strong>only available in Hugo 0.55 and later.</strong></p>
<p>Before the version 0.55 you would have to do something like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="nx">$type</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Type</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">$key</span><span class="o">,</span><span class="w"> </span><span class="nx">$value</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Data.Terms.Alphabetical</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$name</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="nx">$count</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Count</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">$.Site.GetPage</span><span class="w"> </span><span class="o">(</span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;/%s/%s&#34;</span><span class="w"> </span><span class="nx">$type</span><span class="w"> </span><span class="nx">$name</span><span class="o">)</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Permalink</span><span class="w"> </span><span class="cp">}}</span><span class="s">&#34;</span><span class="p">&gt;</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$name</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> <span class="cp">{{</span><span class="w"> </span><span class="nx">$count</span><span class="w"> </span><span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span></span></span></code></pre></div>
<p>So, my conclusion is that the <strong>Hugo version on Netlify less than 0.55, while my local version is 0.69.2</strong>, and the first code approach above only available in Hugo 0.55 and later. That&rsquo;s why I got the errors.</p>
<h1 id="solutions">Solutions</h1>
<p>Then what&rsquo;s the solutions?  If you have the same errors or similar like I got, you can try 2 options.</p>
<p>First you can change the code like second code approach above, so that can runs on Hugo version you running on Netlify.</p>
<p>Or you can do like what I do</p>
<p>Instead change the code, I prefer to add a new file to my site, the file is <code>netlify.toml</code>. This file can <strong>set Hugo version</strong> and other settings for your environments in Netlify.</p>
<p>When I deploy my Hugo site to Netlify on the first time I don&rsquo;t create <code>netlify.toml</code>, but everything works fine until I customize the layouts theme site to add a list of terms taxonomies tags and then got the errors.</p>
<p>Because that errors, I decided to add <code>netlify.toml</code> to <strong>ensure Hugo version</strong> in Netlify has the same version with my local machine, so that can <strong>reduce similar errors in the future</strong> because different Hugo version.</p>
<p>Here&rsquo;s code in my <code>netlify.toml</code> file:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">build</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">publish</span> <span class="p">=</span> <span class="s2">&#34;public&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">command</span> <span class="p">=</span> <span class="s2">&#34;hugo --gc --minify&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">production</span><span class="p">.</span><span class="nx">environment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_VERSION</span> <span class="p">=</span> <span class="s2">&#34;0.69.2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_ENV</span> <span class="p">=</span> <span class="s2">&#34;production&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_ENABLEGITINFO</span> <span class="p">=</span> <span class="s2">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">split1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">command</span> <span class="p">=</span> <span class="s2">&#34;hugo --gc --minify --enableGitInfo&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">split1</span><span class="p">.</span><span class="nx">environment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_VERSION</span> <span class="p">=</span> <span class="s2">&#34;0.69.2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_ENV</span> <span class="p">=</span> <span class="s2">&#34;production&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">deploy-preview</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">command</span> <span class="p">=</span> <span class="s2">&#34;hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">deploy-preview</span><span class="p">.</span><span class="nx">environment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_VERSION</span> <span class="p">=</span> <span class="s2">&#34;0.69.2&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">branch-deploy</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">command</span> <span class="p">=</span> <span class="s2">&#34;hugo --gc --minify -b $DEPLOY_PRIME_URL&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">branch-deploy</span><span class="p">.</span><span class="nx">environment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_VERSION</span> <span class="p">=</span> <span class="s2">&#34;0.69.2&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">context</span><span class="p">.</span><span class="nx">next</span><span class="p">.</span><span class="nx">environment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">HUGO_ENABLEGITINFO</span> <span class="p">=</span> <span class="s2">&#34;true&#34;</span></span></span></code></pre></div></p>
<p>Save <code>netlify.toml</code> file into your <code>root directory</code> Hugo site, and then push + re-deploy into Netlify, if everything works fine the errors should be gone and you can preview your site before publishing.</p>
<p>You can see the newest example <code>netlify.toml</code>on official Hugo website: <a href="https://gohugo.io/hosting-and-deployment/hosting-on-netlify/#configure-hugo-version-in-netlify" title="Configure Hugo version in Netlify">Configure Hugo version in Netlify</a>.</p>
<hr>
<blockquote>
<p>That&rsquo;s all, hope this helps you :)</p>
</blockquote>
<h2 id="attachment">Attachment</h2>
<h4 id="deploy-log-before-add-netlifytoml">Deploy log before add <code>netlify.toml</code></h4>
<pre><code>8:41:32 AM: Build ready to start
8:41:34 AM: build-image version: 2dbd444fcdce00cf06325060a8238d5ae3e86774
8:41:34 AM: build-image tag: v3.3.7
8:41:34 AM: buildbot version: d305548225ac57bb00eb5a596b0b8674e76a4681
8:41:34 AM: Fetching cached dependencies
8:41:34 AM: Starting to download cache of 119.6MB
8:41:35 AM: Finished downloading cache in 604.32311ms
8:41:35 AM: Starting to extract cache
8:41:39 AM: Finished extracting cache in 4.285960043s
8:41:39 AM: Finished fetching cache in 4.930258489s
8:41:39 AM: Starting to prepare the repo for build
8:41:40 AM: Preparing Git Reference refs/heads/master
8:41:40 AM: Starting build script
8:41:40 AM: Installing dependencies
8:41:41 AM: Started restoring cached node version
8:41:45 AM: Finished restoring cached node version
8:41:46 AM: v10.20.1 is already installed.
8:41:47 AM: Now using node v10.20.1 (npm v6.14.4)
8:41:47 AM: Attempting ruby version 2.6.2, read from environment
8:41:48 AM: Using ruby version 2.6.2
8:41:48 AM: Using PHP version 5.6
8:41:48 AM: Started restoring cached go cache
8:41:48 AM: Finished restoring cached go cache
8:41:48 AM: unset GOOS;
8:41:48 AM: unset GOARCH;
8:41:48 AM: export GOROOT='/opt/buildhome/.gimme/versions/go1.12.linux.amd64';
8:41:48 AM: export PATH=&quot;/opt/buildhome/.gimme/versions/go1.12.linux.amd64/bin:${PATH}&quot;;
8:41:48 AM: go version &gt;&amp;2;
8:41:48 AM: export GIMME_ENV='/opt/buildhome/.gimme/env/go1.12.linux.amd64.env';
8:41:48 AM: go version go1.12 linux/amd64
8:41:48 AM: Installing missing commands
8:41:48 AM: Verify run directory
8:41:48 AM: Executing user command: hugo
8:41:49 AM: Building sites …
8:41:49 AM: ERROR 2020/05/03 01:41:49 render of &quot;taxonomyTerm&quot; failed: &quot;/opt/build/repo/layouts/tags/terms.html:15:25&quot;: execute of template failed: template: tags/terms.html:15:25: executing &quot;main&quot; at &lt;.Page.Permalink&gt;: can't evaluate field Page in type hugolib.OrderedTaxonomyEntry
8:41:49 AM: Total in 179 ms
8:41:49 AM: Error: Error building site: failed to render pages: render of &quot;taxonomyTerm&quot; failed: &quot;/opt/build/repo/layouts/_default/terms.html:15:20&quot;: execute of template failed: template: _default/terms.html:15:20: executing &quot;main&quot; at &lt;.Page.Permalink&gt;: can't evaluate field Page in type hugolib.OrderedTaxonomyEntry
8:41:49 AM: Skipping functions preparation step: no functions directory set
8:41:49 AM: Caching artifacts
8:41:49 AM: Started saving pip cache
8:41:49 AM: Finished saving pip cache
8:41:49 AM: Started saving emacs cask dependencies
8:41:49 AM: Finished saving emacs cask dependencies
8:41:49 AM: Started saving maven dependencies
8:41:49 AM: Finished saving maven dependencies
8:41:49 AM: Started saving boot dependencies
8:41:49 AM: Finished saving boot dependencies
8:41:49 AM: Started saving go dependencies
8:41:49 AM: Finished saving go dependencies
8:41:49 AM: Error running command: Build script returned non-zero exit code: 255
8:41:49 AM: Failing build: Failed to build site
8:41:49 AM: failed during stage 'building site': Build script returned non-zero exit code: 255
8:41:49 AM: Finished processing build request in 14.990296865s
</code></pre>
<h4 id="deploy-log-after-add-netlifytoml">Deploy log after add <code>netlify.toml</code></h4>
<pre><code>9:04:41 AM: Build ready to start
9:04:47 AM: build-image version: 2dbd444fcdce00cf06325060a8238d5ae3e86774
9:04:47 AM: build-image tag: v3.3.7
9:04:47 AM: buildbot version: d305548225ac57bb00eb5a596b0b8674e76a4681
9:04:47 AM: Fetching cached dependencies
9:04:47 AM: Starting to download cache of 119.5MB
9:04:48 AM: Finished downloading cache in 1.447053178s
9:04:48 AM: Starting to extract cache
9:04:53 AM: Finished extracting cache in 4.635581249s
9:04:53 AM: Finished fetching cache in 6.108181019s
9:04:53 AM: Starting to prepare the repo for build
9:04:53 AM: Preparing Git Reference refs/heads/master
9:04:54 AM: Found Netlify configuration file netlify.toml in site root
9:04:54 AM: Found Netlify configuration file(s). Overriding site configuration
9:04:54 AM: Different build command detected, going to use the one specified in the Netlify configuration file: 'hugo --gc --minify' versus 'hugo' in the Netlify UI
9:04:54 AM: Starting build script
9:04:54 AM: Installing dependencies
9:04:55 AM: Started restoring cached node version
9:04:59 AM: Finished restoring cached node version
9:04:59 AM: v10.20.1 is already installed.
9:05:00 AM: Now using node v10.20.1 (npm v6.14.4)
9:05:00 AM: Attempting ruby version 2.6.2, read from environment
9:05:01 AM: Using ruby version 2.6.2
9:05:02 AM: Using PHP version 5.6
9:05:02 AM: Installing Hugo 0.69.2
9:05:03 AM: Hugo Static Site Generator v0.69.2-EC9DCF30/extended linux/amd64 BuildDate: 2020-04-24T07:57:53Z
9:05:03 AM: Started restoring cached go cache
9:05:03 AM: Finished restoring cached go cache
9:05:03 AM: unset GOOS;
9:05:03 AM: unset GOARCH;
9:05:03 AM: export GOROOT='/opt/buildhome/.gimme/versions/go1.12.linux.amd64';
9:05:03 AM: export PATH=&quot;/opt/buildhome/.gimme/versions/go1.12.linux.amd64/bin:${PATH}&quot;;
9:05:03 AM: go version &gt;&amp;2;
9:05:03 AM: export GIMME_ENV='/opt/buildhome/.gimme/env/go1.12.linux.amd64.env';
9:05:03 AM: go version go1.12 linux/amd64
9:05:03 AM: Installing missing commands
9:05:03 AM: Verify run directory
9:05:03 AM: Executing user command: hugo --gc --minify
9:05:03 AM: Building sites …
9:05:03 AM:                   |
9:05:03 AM:  EN
9:05:03 AM: -
9:05:03 AM: ------------------+-----
9:05:03 AM: Pages            | 43
9:05:03 AM: Paginator pages  |  0
9:05:03 AM:   Non-page files   |
9:05:03 AM:  0
9:05:03 AM:   Static files     | 16
9:05:03 AM:   Processed images |
9:05:03 AM:  0
9:05:03 AM:   Aliases          |  1
9:05:03 AM:   Sitemaps         |  1
9:05:03 AM:   Cleaned          |  0
9:05:03 AM: Total in 244 ms
9:05:03 AM: Skipping functions preparation step: no functions directory set
9:05:03 AM: Caching artifacts
9:05:03 AM: Started saving pip cache
9:05:03 AM: Finished saving pip cache
9:05:03 AM: Started saving emacs cask dependencies
9:05:03 AM: Finished saving emacs cask dependencies
9:05:03 AM: Started saving maven dependencies
9:05:03 AM: Finished saving maven dependencies
9:05:03 AM: Started saving boot dependencies
9:05:03 AM: Finished saving boot dependencies
9:05:03 AM: Started saving go dependencies
9:05:03 AM: Finished saving go dependencies
9:05:03 AM: Build script success
9:05:03 AM: Starting to deploy site from 'public'
9:05:03 AM: Creating deploy tree 
9:05:04 AM: Creating deploy upload records
9:05:04 AM: 44 new files to upload
9:05:04 AM: 0 new functions to upload
9:05:05 AM: Starting post processing
9:05:09 AM: Post processing done
9:05:09 AM: Site is live
9:05:26 AM: Finished processing build request in 39.584859143s
</code></pre>
]]></content></item><item><title>Initial Post</title><link>https://budi.day/2019/11/initial-post/</link><pubDate>Mon, 04 Nov 2019 16:16:25 +0700</pubDate><guid>https://budi.day/2019/11/initial-post/</guid><description>This is the initial post on my blog 😁</description><content type="html">&lt;p>This is the initial post on my blog 😁&lt;/p></content></item></channel></rss>