<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hanif Dwy Putra S</title><description>hanifu.id - Hanif Dwy Putra S&apos;s blog</description><link>https://hanifu.id/</link><language>en</language><item><title>Jalur Polisi atau Takedown?</title><link>https://hanifu.id/posts/06-got-direct-call-snbt/</link><guid isPermaLink="true">https://hanifu.id/posts/06-got-direct-call-snbt/</guid><description>Selang 2-3 bulan ramainya project SNBT Dumper yang saya dan teman saya. Hal tersebut mendapatkan notice dari Kemdikbudristek untuk meminta saya untuk melakukan takedown atau melalui jalur kepolisian.</description><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Perkenalan&lt;/h2&gt;
&lt;p&gt;Halo guys, bagi yang belum kenal saya, kenalin nama saya &lt;strong&gt;Hanif&lt;/strong&gt;, panggil aja &lt;strong&gt;Nif&lt;/strong&gt; atau &lt;strong&gt;Nip&lt;/strong&gt;.
Aku programmer pemula yang baru belajar programming kurang lebih 3 tahun lamanya. Dan, memiliki pengalaman bekerja di real projects kurang lebih 1 tahun.&lt;/p&gt;
&lt;h2&gt;SNBT Dumper&lt;/h2&gt;
&lt;p&gt;Bagi teman-teman yang belum mengetahui SNBT Dumper. SNBT Dumper adalah project dumping data UTBK/SNBT saat lalu yang dibuat oleh teman saya dan saya pribadi untuk kebutuhan statistik lulusan sekolah. Project ini tentunya sangat bermanfaat bagi sekolah dalam melakukan tracking alumni/lulusan melalui jalur SNBT.&lt;/p&gt;
&lt;p&gt;Sekali lagi, saya menekankan project ini &lt;strong&gt;berdasarkan ide atau gagasan kami untuk memudahkan kami dalam melakukan kolektif data atau membuat statistika data terkait UTBK&lt;/strong&gt; yang telah dimulai sejak tahun 2024. Tidak ada maksud dalam melakukan &lt;em&gt;data leaking&lt;/em&gt;, karena pada waktu tersebut data yang disajikan telah terbuka secara publik oleh pihak SNPMB.&lt;/p&gt;
&lt;h2&gt;UTBK2025 Service&lt;/h2&gt;
&lt;p&gt;Setelah hadirnya project &lt;strong&gt;SNBT Dumper&lt;/strong&gt;, saya membuat kembali project bernama &lt;strong&gt;UTBK2025&lt;/strong&gt; dengan host &lt;strong&gt;https://utbk2025.hanifu.id&lt;/strong&gt; untuk melakukan data view per universitas dan per prodi untuk memudahkan dalam melakukan analisis dan statistik data.&lt;/p&gt;
&lt;p&gt;Website saya tersebut mendapat high demand traffic ketika sedang booming di platform &lt;strong&gt;X&lt;/strong&gt; (lihat di https://x.com/mawleleee/status/1942529979809427605), hal ini menyebabkan pada per tanggal &lt;strong&gt;8 Juli 2025&lt;/strong&gt; resource server yang saya gunakan untuk melakukan deployment project tersebut mengalami usage resources yang cukup tinggi sehingga sempat mengalami down (&lt;em&gt;redisnya penuh bang wkwkwk&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;Berdasarkan sentimen, respons orang-orang sedikit negatif dengan pemerintah tentang keamanan data. Dan, mostly menilai mengapa data seperti ini lengkap sedetail-detailnya terexpose ke publik baik yang lolos dan tidak.&lt;/p&gt;
&lt;h2&gt;Notice dari Kemdikbudristek! 🤔🤔&lt;/h2&gt;
&lt;p&gt;Per tanggal &lt;strong&gt;14 Juli 2025&lt;/strong&gt;, pada kurang lebih pukul 13.00 WITA saya mendapatkan telepon langsung dari guru saya yang berada di sekolah untuk memberitahukan kepada saya terkait &lt;em&gt;direct call&lt;/em&gt; dari Kemdikbudristek untuk meminta saya untuk melakukan &lt;em&gt;takedown&lt;/em&gt; 2 services, yakni:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;https://utbk2025.hanifu.id&lt;/li&gt;
&lt;li&gt;https://snbtx.mnct.eu.org&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/GvzKtLBWIAAxkPz?format=png&amp;amp;name=small&quot; alt=&quot;Gambar&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pada pemberitahuan yang diberikan kepada saya, utusan dari Kemdikbudristek meminta kepada saya melalui Kepala Sekolah SMA Negeri 3 Palu (sekolah saya) untuk melakukan takedown atau dibawa ke ranah kepolisian. Sontak saya, otomatis untuk melakukan takedown saja daripada urusan yang lebih panjang berikutnya (&lt;em&gt;I&apos;m poor wkwk, and masih ingin melanjutkan kuliah&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;Telepon kepada Kepala Sekolah berdasarkan informasi yang saya tanyakan pada guru yang menyampaikan informasi tersebut kepada saya, kurang lebih pada pukul 10.00 WITA. Dan, disampaikan kepada saya kurang lebih pukul 13.00 WITA.&lt;/p&gt;
&lt;h2&gt;Catatan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Data UTBK 2025 masih ada dalam file storage saya, dan limited access untuk websitenya.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[
    {
        &quot;file&quot;: &quot;utbk-2025.db&quot;,
        &quot;size&quot;: &quot;73.9 MB&quot;,
        &quot;dumps&quot;: [2025]
    },
    {
        &quot;file&quot;: &quot;data.db&quot;,
        &quot;size&quot;: &quot;209.1 MB&quot;,
        &quot;dumps&quot;: [2025, 2025]
    }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Saya hanya melakukan shutdown application yang diminta untuk memberhentikan akses data publik.&lt;/li&gt;
&lt;li&gt;Harapan saya kepada pihak SNPMB pada tahun depan (2026) lebih memperhatikan kembali GCS (Google Cloud Storage) rules, dan dapat melakukan improvement kembali pada sistem yang digunakan.&lt;/li&gt;
&lt;li&gt;Saya memiliki data sebelum &lt;strong&gt;28 Mei 2025&lt;/strong&gt; yakni &lt;strong&gt;26 Mei 2025&lt;/strong&gt;, apabila ditemukannya kejanggalan data yang tersedia dengan setelahnya, akan saya buat &lt;em&gt;writeup&lt;/em&gt; nya.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Dumping SNBT</title><link>https://hanifu.id/posts/05-snbt-dumper/</link><guid isPermaLink="true">https://hanifu.id/posts/05-snbt-dumper/</guid><description>Dump data siswa SNBT 2024 as free record history, does it work too in 2025?</description><pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SNBT&lt;/h1&gt;
&lt;p&gt;Seleksi Nasional Berbasis Tes, tentunya teman-teman tidak asing bukan? Yap bener banget, SNBT baru aja diluncur beberapa tahun yang lalu.
Namun, temen-temen siapa nih yang kemarin sempet lolos SNBT 2024? Selamat ya 😄&lt;/p&gt;
&lt;h2&gt;SNBT Dumper&lt;/h2&gt;
&lt;p&gt;Wait? What is that? SNBT Dumper? Yap, SNBT Dumper merupakan tool sederhana untuk melakukan dumping data dari situs kemendikbud untuk memperoleh data-data siswa siapa saja yang termasuk ke dalam SNBT.
Data yang diperoleh, meliputi No. UTBK, Nama, dan Kampus tujuan jika lolos.&lt;/p&gt;
&lt;h2&gt;What is purpose of SNBT Dumper?&lt;/h2&gt;
&lt;p&gt;The purpose of SNBT Dumper adalah untuk menyajikan data historikal secara terbuka dan open-source bagi semuanya yang ingin melihat data SNBT Indonesia.
The simply purpose is just &quot;iseng&quot; actually hahaha.&lt;/p&gt;
&lt;h2&gt;Flow&lt;/h2&gt;
&lt;p&gt;Apabila kita merujuk pada situs cek pengumuman SNBT (https://pengumuman-snbt-snpmb.bppp.kemdikbud.go.id/), disini hanya terlihat kolomnya saja bukan?
&lt;img src=&quot;https://github.com/user-attachments/assets/4574bad0-f04e-4d1f-98e0-3d737313518c&quot; alt=&quot;image&quot; /&gt;
Namun, apabila kita menilik lebih lanjut pada inspect element/sources sambil melakukan input data yang random, kita dapat melihat error 404 pada Networks
&lt;img src=&quot;https://github.com/user-attachments/assets/95d57010-9d30-47c1-9e7b-067ec4e64a7b&quot; alt=&quot;image&quot; /&gt;
GYATT!!! We caught the googleapis storage url, terlihat menarik, coba kita kulik lebih dalam
&lt;img src=&quot;https://github.com/user-attachments/assets/d5e52ec9-521a-4a9a-aa96-18a63405e1d7&quot; alt=&quot;image&quot; /&gt;
Hmm?? Sama aja nih, coba lagi kita akses root pathnya
&lt;img src=&quot;https://github.com/user-attachments/assets/cb8024c9-e584-435a-b292-e5c59b9b2929&quot; alt=&quot;image&quot; /&gt;
Voilaa, we got entire SNBT users data heree.&lt;/p&gt;
&lt;h2&gt;Technical&lt;/h2&gt;
&lt;p&gt;Oke lanjut nih, kita kan udah berhasil dapat datanya semua (hampir), gimana kita cara dapatinnya secara otomatis?
Berdasarkan kode yang ada pada sumber &lt;code&gt;snbt.min.js&lt;/code&gt;, kita dapat melihat ada kode untuk fetching data &lt;code&gt;.dwg&lt;/code&gt;, dan kemudian diolah ke UI.&lt;/p&gt;
&lt;p&gt;Disini, saya ngga pake banyak tool, cuman runtime &lt;code&gt;Python 3.10&lt;/code&gt; dengan dependencies &lt;code&gt;xmltodict&lt;/code&gt;, &lt;code&gt;requests&lt;/code&gt;, dan &lt;code&gt;sqlite3&lt;/code&gt; aja.
Kurang lebih kodenya seperti dibawah ini,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import xmltodict
import csv
import requests
import sqlite3
from datetime import datetime
from config import config

current_timestamp = datetime.now().isoformat()

snbt_files = {
    &apos;excel&apos;: f&apos;snbt_dump_{current_timestamp}.csv&apos;, # CSV
    &apos;db&apos;: f&apos;snbt_dump_{current_timestamp}.db&apos;, # sqlite
}

&quot;&quot;&quot;
    Request data to SNBT GoogleApi Storage
&quot;&quot;&quot;
def request_data_all():
    response = requests.get(config.get(&apos;storage_url&apos;))
    if response.status_code != 200:
        raise Exception(&quot;Response not 200&quot;)
    # Parsing XML
    dictxml = xmltodict.parse(response.text)

    # Contents
    keys = [data[&apos;Key&apos;] for data in dictxml[&apos;ListBucketResult&apos;][&apos;Contents&apos;] if data[&apos;Key&apos;].endswith(&apos;.dwg&apos;)]

    return keys

def request_data_dwg(key: str):
    response = requests.get(config.get(&apos;storage_url&apos;) + key, headers={
        &apos;Accept&apos;: &apos;application/json&apos;,
    })
    if response.status_code != 200:
        raise Exception(&quot;Response not 200&quot;)
    
    return response.json()

# Retrieving keys
print(&apos;Retrieving data keys...&apos;) # Logging keys
keys = request_data_all()
print(f&apos;Receiving {len(keys)} keys&apos;) # Logging after keys

# Prepare heads
heads = [&apos;id&apos;, &apos;utbk_no&apos;, &apos;name&apos;, &apos;date_of_birth&apos;, &apos;bidik_misi&apos;, &apos;passed&apos;, &apos;ptn&apos;, &apos;ptn_code&apos;, &apos;prodi&apos;, &apos;prodi_code&apos;, &apos;next_url&apos;]

# Preparing files
print(&apos;Initializing SQLite3 and CSV Files&apos;) # Logging files

sqlite_file = sqlite3.connect(snbt_files[&apos;db&apos;])
sqlite_cursor = sqlite_file.cursor()

csv_file = open(snbt_files[&apos;excel&apos;], &quot;w+&quot;)
csv_file_writer = csv.writer(csv_file, delimiter=&apos;,&apos;, quotechar=&apos;;&apos;)

csv_file_writer.writerow(heads)

## SQLite3 create table if not exists
sqlite_create_table_query = &quot;&quot;&quot;
    CREATE TABLE IF NOT EXISTS snbt_dump (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        utbk_no VARCHAR(255) NOT NULL,
        name VARCHAR(255) NOT NULL,
        date_of_birth VARCHAR(50) NOT NULL,
        bidik_misi INT(1),
        passed INT(1) NOT NULL,
        ptn VARCHAR(255),
        ptn_code INT,
        prodi VARCHAR(255),
        prodi_code INT,
        next_url VARCHAR(255)
    )
&quot;&quot;&quot;

sqlite_insert_row_query = &quot;&quot;&quot;
    INSERT INTO snbt_dump (
        id,
        utbk_no,
        name,
        date_of_birth,
        bidik_misi,
        passed,
        ptn,
        ptn_code,
        prodi,
        prodi_code,
        next_url
    ) VALUES (
        ?,
        ?,
        ?,
        ?,
        ?,
        ?,
        ?,
        ?,
        ?,
        ?,
        ?
    )
&quot;&quot;&quot;

sqlite_cursor.execute(sqlite_create_table_query)
print(&apos;Files successfuly initialized&apos;) # Logging files

# Fetching and write
index = 1
for key in keys:
    print(f&apos;Fetching {key}&apos;)
    data = request_data_dwg(key)

    rows = [
        index,
        data[&apos;no&apos;],
        data[&apos;na&apos;],
        data[&apos;dob&apos;],
        data[&apos;bm&apos;],
        data[&apos;ac&apos;],
        data[&apos;npt&apos;],
        data[&apos;kpt&apos;],
        data[&apos;nps&apos;],
        data[&apos;kps&apos;],
        data[&apos;upt&apos;],
    ]

    csv_file_writer.writerow(rows)
    sqlite_cursor.execute(sqlite_insert_row_query, rows)

    index += 1


# Closing all state
csv_file.close()
sqlite_cursor.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Setelah kita run, boom kita dapat data sebanyak dibawah ini
&lt;img src=&quot;https://github.com/user-attachments/assets/25ad6889-e8ef-4cff-881e-41308fa3dc54&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Mungkin saya bakalan update lagi mengenai SNBT Dumper ini di next article. Thanks for reading guys!&lt;/p&gt;
</content:encoded></item><item><title>Membuat TLS/SSL Certificate Secara Gratis Dengan Letsencrypt</title><link>https://hanifu.id/posts/04-how-to-generate-letsencrypt-tls/</link><guid isPermaLink="true">https://hanifu.id/posts/04-how-to-generate-letsencrypt-tls/</guid><description>Hari ini gini masih HTTP? Beralih ke HTTPS dong, lebih secure 😎😋</description><pubDate>Sun, 25 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Preambule&lt;/h1&gt;
&lt;p&gt;Hola-hola, have a nice day everyone ✌️❤️ Pada artikel ini saya akan sharing gimana sih buat TLS certificate untuk domain kita secara gratis selamanya 🤔&lt;/p&gt;
&lt;h2&gt;Apa itu TLS/SSL?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TLS&lt;/strong&gt; merupakan singkatan dari &lt;em&gt;Transport Layer Secure&lt;/em&gt;, yakni pengembangan lanjut dari &lt;strong&gt;SSL&lt;/strong&gt; (&lt;em&gt;Socket Secure Layer&lt;/em&gt;). Namun, pada saat ini kebanyakan penggunaan istilah SSL digunakan untuk menjelaskan konsep sederhana dari TLS. Jadi, teknologi yang sekarang kita gunakan adalah TLS ya! 😎&lt;/p&gt;
&lt;h1&gt;Langkah-langkah&lt;/h1&gt;
&lt;p&gt;Udah, gas aja lah ya 😂 Selamat disimak ╰(&lt;em&gt;°▽°&lt;/em&gt;)╯&lt;/p&gt;
&lt;h2&gt;Persiapan&lt;/h2&gt;
&lt;p&gt;Hal-hal yang perlu disiapkan antara lain adalah:,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;domain (bebas beli dimana aja pak)&lt;/li&gt;
&lt;li&gt;vps/server (ini juga bebas beli dimana aja, lebih baik lagi kalau udah dapat IPv4 sendiri pak)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 1 - Install Webserver NGINX &amp;amp; Certbot&lt;/h2&gt;
&lt;p&gt;Tanpa basa-basi, langsung gas bae 😎 Kita install dulu nih webservernya, kita bakalan pake &lt;a href=&quot;https://nginx.org&quot;&gt;nginx&lt;/a&gt; lagi cuy.
Dan, of course ada tool baru nih, kenalin &lt;a href=&quot;https://certbot.eff.org&quot;&gt;certbot&lt;/a&gt;. &lt;strong&gt;Cerbot&lt;/strong&gt; merupakan tool CLI (Command-Line Interface) yang digunakan di server sistem UNIX (salah satunya GNU/Linux), fungsinya apa? Untuk membantu kita dalam generate SSL &lt;a href=&quot;https://letsencrypt.org&quot;&gt;LetsEncrypt&lt;/a&gt; cuy ✌️&lt;/p&gt;
&lt;p&gt;Untuk installnya gimana?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nginx certbot python3-certbot-nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Udah gitu aja 😏&lt;/p&gt;
&lt;p&gt;:::caution
Di beberapa kasus repository biasanya ada yang missing, silahkan update terlebih dahulu dengan cara berikut (jika Debian based)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;Step 2 - Konfigurasi NGINX&lt;/h2&gt;
&lt;p&gt;Di step ini kita akan konfigurasi NGINX untuk protokol HTTP terlebih dahulu. Kenapa? Karena certbot akan mengaturnya untuk kita nanti 😎 Oke lets say kita mau reverse proxy ke app di VPS kita yang berjalan di port &lt;code&gt;5000&lt;/code&gt;, maka ip address reversenya adalah &lt;code&gt;http://127.0.0.1:5000&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Maka konfigurasinya kurang lebih akan seperti ini (silahkan buat file baru di &lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt;), misal saya buat dengan nama file &lt;code&gt;/etc/nginx/sites-available/app-reverse-http&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    listen [::]:80;

    server_name domainkalian.id;

    location / {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jangan lupa ganti &lt;code&gt;domainkalian.id&lt;/code&gt; dengan domain milik kalian.&lt;/li&gt;
&lt;li&gt;Dan, jangan lupa juga mengganti &lt;code&gt;5000&lt;/code&gt; pada proxy_pass untuk menyesuaikan port app yang berjalan.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lalu untuk pengaktifannya bisa melalui command-command dibawah,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/app-reverse-http /etc/nginx/sites-enabled/app-reverse-http
sudo nginx -t # apakah sudah aman?

sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
Silahkan ganti &lt;code&gt;app-reverse-http&lt;/code&gt; dengan nama file konfigurasi NGINX kalian masing-masing yang telah dibuat ya!
:::&lt;/p&gt;
&lt;h2&gt;Step 3 - Tambah DNS Record Pada Domain&lt;/h2&gt;
&lt;p&gt;Agar cerbot dapat bekerja untuk mengeluarkan sertifikat TLS, maka diperlukannya verifikasi bahwa domain name yang di request telah aktif dan telah pointing ke server VPS. Silahkan menuju DNS Managementnya masing-masing, saya pribadi menggunakan DNS Managementnya &lt;a href=&quot;https://cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Untuk data recordnya kurang lebih seperti gambar dibawah ya guys ya ✌️
&lt;img src=&quot;https://i.imgur.com/LkLCrZU.png&quot; alt=&quot;dns cloudflare&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Step 4 - Eksekusi certbot&lt;/h2&gt;
&lt;p&gt;Kalau kita udah pointing DNS Recordnya ke server VPSnya, ini udah gampang. Sisa kita eksekusi langsung aja si certbotnya 😏
Commandnya gimana?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot -d domainkalian.id --nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Udah, singkat kan? 😋 Nah, silahkan teman-teman isi saja field yang diminta oleh certbotnya (seperti e-mail, yes dalam ToS, dan yes/no dikirim mailing oleh letsencrypt)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/yZIvIu8.png&quot; alt=&quot;sukses letsencrypt ni bos&quot; /&gt;
&lt;img src=&quot;https://i.imgur.com/LaAh8y0.png&quot; alt=&quot;sukses letsencrypt dns&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Jika teman-teman sudah mendapatkan output seperti gambar diatas, maka pembuatan sertifikat TLS telah berhasil 😏&lt;/p&gt;
&lt;h1&gt;Penutup&lt;/h1&gt;
&lt;p&gt;Kurang lebihnya itu saja yang dapat saya sampaikan, mohon maaf kurang dan lebihnya kata, see you next time ya, ehee ✌️
&lt;img src=&quot;https://media1.tenor.com/m/g7aTr2MQ7KkAAAAC/kaori-kaori-peace.gif&quot; alt=&quot;kaori bye bye&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Bagaimana cara setup Node.js App + NGINX di VPS?</title><link>https://hanifu.id/posts/03-how-to-deploy-node-nginx/</link><guid isPermaLink="true">https://hanifu.id/posts/03-how-to-deploy-node-nginx/</guid><description>Bagaimana sih setup project Node.js dengan webserver NGINX di VPS?</description><pubDate>Sat, 24 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Preambule&lt;/h1&gt;
&lt;p&gt;👋 Halo guys, terimakasih sudah berkunjung. Sebelum lebih lanjut ke gimana cara setupnya, mendingan kita ketahui dulu secara mendasar istilah teknologi yang akan kita gunakan nantinya.&lt;/p&gt;
&lt;h2&gt;Lompat isi&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#bagaimana-cara-setupnya&quot;&gt;Bagaimana cara setup?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#langkah-langkah&quot;&gt;Langkah-langkah&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-1---connect-ke-vps&quot;&gt;Step 1 - SSH Command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-2---verifikasi-fingerprint-dan-password&quot;&gt;Step 2 - Login to VPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-3---install-nginx-dan-update-dependencies&quot;&gt;Step 3 - Installing NGINX &amp;amp; update dependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-4---install-nodejs&quot;&gt;Step 4 - Install Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-5---konfigurasi-project-nodejs&quot;&gt;Step 5 - Konfigurasi Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-6---menjalankan-nodejs-app&quot;&gt;Step 6 - Menjalankan Node.js App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#step-7---nginx-setup&quot;&gt;Step 7 - Setup NGINX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#direct-ip-dengan-ssl&quot;&gt;Step 7.1 - Setup NGINX Direct IP dengan SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#domain-dengantanpa-ssl&quot;&gt;Step 7.2 - Setup NGINX Domain tanpa SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#dengan-ssl&quot;&gt;Step 7.3 - Setup NGINX Domain dengan SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#penutup&quot;&gt;Penutup&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Apa itu VPS?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;VPS&lt;/strong&gt; (Virtual Private Server) adalah sebuah sistem yang memanfaatkan teknologi virtualisasi untuk membagi satu server fisik menjadi beberapa server virtual yang terpisah. Setiap server virtual ini memiliki sistem operasi dan sumber daya sendiri (seperti CPU, RAM, dan storage) yang dialokasikan secara eksklusif.&lt;/p&gt;
&lt;h2&gt;Apa itu NGINX?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NGINX&lt;/strong&gt;, singkatan dari &quot;engine-x&quot;, adalah software open-source yang berfungsi sebagai server web, reverse proxy untuk mendistribusikan lalu lintas, load balancer untuk menyeimbangkan beban server, serta proxy email untuk protokol IMAP, POP3, dan SMTP.&lt;/p&gt;
&lt;h2&gt;Apa itu Node.js?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Node.js® is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Secara singkat, &lt;strong&gt;Node.js&lt;/strong&gt; adalah runtime environment yang memungkinkan kita untuk menjalankan kode JavaScript di luar browser.&lt;/p&gt;
&lt;h3&gt;Mengapa menggunakan NGINX?&lt;/h3&gt;
&lt;p&gt;Alasan saya pribadi menggunakan NGINX karena konfigurasinya yang cukup mudah dipahami, dibandingkan dengan kompetitornya webserver &lt;a href=&quot;https://apache.org&quot;&gt;Apache&lt;/a&gt;. Selain itu, menurut saya NGINX lebih cepat dan ringan.&lt;/p&gt;
&lt;h1&gt;Bagaimana cara setupnya?&lt;/h1&gt;
&lt;p&gt;Setelah kalian simak definisi diatas, sudah paham bukan teknologi yang akan kita gunakan? Tentunya dongg, hehehehe 😎&lt;/p&gt;
&lt;p&gt;Sebelum memulai, tentunya kita membutuhkan beberapa persiapan, diantaranya:,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;server&lt;/strong&gt; atau &lt;strong&gt;VPS&lt;/strong&gt; (Virtual Machine Server) yang akan digunakan untuk deployment (dapat dibeli di &lt;a href=&quot;https://raznar.id&quot;&gt;Raznar&lt;/a&gt;, &lt;a href=&quot;https://idcloudhost.com&quot;&gt;IDCloudHost&lt;/a&gt;, dan &lt;a href=&quot;https://hostdata.id&quot;&gt;Hostdata.ID&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;project node.js yang akan dijalankan (bisa dalam bentuk repository &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;terminal atau command prompt (pastikan dapat menggunakan perintah &lt;code&gt;ssh&lt;/code&gt;, seperti gambar dibawah ya)
&lt;img src=&quot;https://i.imgur.com/nAtTx6L.png&quot; alt=&quot;Gambar SSH&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dalam kasus ini, saya membeli VPS dari &lt;a href=&quot;https://idcloudhost.com&quot;&gt;IDCloudHost&lt;/a&gt; dengan spesifikasi sebagai berikut,
&lt;img src=&quot;https://i.imgur.com/ePGFa6v.png&quot; alt=&quot;Specifications server&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Setelah itu, kurang lebih teman-teman akan mendapatkan detil server yang sudah terbuat sebagai berikut,
&lt;img src=&quot;https://i.imgur.com/HotK00R.png&quot; alt=&quot;Server details&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Langkah-langkah&lt;/h2&gt;
&lt;h3&gt;Step 1 - Connect ke VPS&lt;/h3&gt;
&lt;p&gt;Teman-teman silahkan membuka command prompt atau terminal favoritnya, lalu mengetik perintah sebagai berikut,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;ssh [USERNAME VPS]@[IP VPS]&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::note
Jangan lupa untuk mengganti &lt;code&gt;[USERNAME VPS]&lt;/code&gt; dan &lt;code&gt;[IP VPS]&lt;/code&gt; dengan username serta IP VPS-nya teman-teman. Tanpa &lt;code&gt;[&lt;/code&gt; dan &lt;code&gt;]&lt;/code&gt; yaa!
:::&lt;/p&gt;
&lt;h3&gt;Step 2 - Verifikasi Fingerprint dan Password&lt;/h3&gt;
&lt;p&gt;Setelah teman-teman mengetik perintah diatas, akan ada permintaan &lt;em&gt;fingerprint verification&lt;/em&gt;, silahkan teman-teman ketik &lt;code&gt;yes&lt;/code&gt; atau enter saja. Seperti berikut,
&lt;img src=&quot;https://i.imgur.com/htsFj2d.png&quot; alt=&quot;Fingerprint vps verification&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kemudian, ketika permintaan password telah muncul seperti diatas, maka silahkan input password VPS yang sesuai.&lt;/p&gt;
&lt;p&gt;:::important
Jangan khawatir, jika password yang diketik tidak muncul, password tersamarkan secara otomatis sebagai bentuk keamanan.
:::&lt;/p&gt;
&lt;h3&gt;Step 3 - Install NGINX dan Update Dependencies&lt;/h3&gt;
&lt;p&gt;Apabila teman-teman telah mengikuti &lt;a href=&quot;#step-2&quot;&gt;step 2&lt;/a&gt;, maka teman-teman akan mendapati home screen seperti berikut,
&lt;img src=&quot;https://i.imgur.com/qAKsZbc.png&quot; alt=&quot;vps homescreen&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Silahkan teman-teman jalankan perintah dibawah ini,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade

sudo apt install git nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo apt update&lt;/code&gt;: Memperbarui daftar paket untuk pembaruan dan penginstallan.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt upgrade&lt;/code&gt;: Memperbarui semua paket yang terinstal pada sistem ke versi terbaru.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt install git nginx -y&lt;/code&gt;: Menginstall Git &amp;amp; NGINX. Flag -y secara otomatis mengkonfirmasi prompt penginstallan (yes/no).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Step 4 - Install Node.js&lt;/h3&gt;
&lt;p&gt;Untuk instalasi Node.js, kita akan menggunakan &lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;Node Version Manager (NVM)&lt;/a&gt;, karena dengan tool ini akan memudahkan kita untuk switch version Node.js tanpa ribet-ribet lagi kedepannya.&lt;/p&gt;
&lt;p&gt;Silahkan copy perintah dibawah untuk menginstall &lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;nvm&lt;/a&gt;,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash

export NVM_DIR=&quot;$([ -z &quot;${XDG_CONFIG_HOME-}&quot; ] &amp;amp;&amp;amp; printf %s &quot;${HOME}/.nvm&quot; || printf %s &quot;${XDG_CONFIG_HOME}/nvm&quot;)&quot;
[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;amp;&amp;amp; \. &quot;$NVM_DIR/nvm.sh&quot; # This loads nvm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kurang lebih jika sudah terinstall, akan seperti gambar berikut apabila kita mengeceknya dengan mengetik perintah &lt;code&gt;nvm&lt;/code&gt;,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/mEQ6ZK4.png&quot; alt=&quot;what nvm looks like?&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Apabila sudah terlihat seperti gambar diatas, silahkan jalankan perintah dibawah,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvm install 21
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
&lt;code&gt;21&lt;/code&gt; bisa diganti dengan versi Node.js lainnya, seperti &lt;code&gt;18&lt;/code&gt;, &lt;code&gt;12&lt;/code&gt;, &lt;code&gt;20&lt;/code&gt;, &lt;code&gt;14&lt;/code&gt; atau pun versi spesifiknya seperti &lt;code&gt;20.17.0&lt;/code&gt;
:::&lt;/p&gt;
&lt;p&gt;Jika proses instalasi sudah selesai, silahkan verifikasi dengan perintah &lt;code&gt;node -v&lt;/code&gt;, apabila jika sudah sesuai dengan versi Node.js yang kalian request, maka proses instalasi sudah berjalan dengan sempurna 😎&lt;/p&gt;
&lt;h3&gt;Step 5 - Konfigurasi Project Node.js&lt;/h3&gt;
&lt;p&gt;Selamat datang di step ke-5, kali ini kita akan membahas bagaimana kita mengkonfigurasi project node.js kita di dalam VPS ini.&lt;/p&gt;
&lt;p&gt;Disini, saya akan menjalankan project Bookshelf API berikut dengan Node.js &lt;code&gt;v21.7.3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hal yang harus dilakukan adalah melakukan cloning repository tersebut ke VPS kita, dengan cara sebagai berikut,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/hansputera/bookshelf-api
cd bookshelf-api # masuk ke directory project tersebut dengan nama bookshelf-api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;selanjutnya, kita akan melakukan instalasi dependencies project tersebut dengan perintah &lt;code&gt;npm i&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Apabila instalasi dependencies sukses, kurang lebih akan muncul sebagai gambar dibawah,
&lt;img src=&quot;https://i.imgur.com/e16apJh.png&quot; alt=&quot;success npm i&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Selanjutnya, kita coba lihat dan ubah jika diperlukan dalam kode atau konfigurasi project Node.js kita, saran dari saya lebih baik apabila teman-teman mengakses environment dari Node.js &lt;code&gt;NODE_ENV&lt;/code&gt; untuk mengecek apakah berstatus &lt;code&gt;production&lt;/code&gt; atau &lt;code&gt;development&lt;/code&gt; untuk menentukan binding server address ke &lt;code&gt;localhost&lt;/code&gt; atau &lt;code&gt;0.0.0.0&lt;/code&gt;
&lt;img src=&quot;https://i.imgur.com/x6v7LsE.png&quot; alt=&quot;example code&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Step 6 - Menjalankan Node.js App&lt;/h3&gt;
&lt;p&gt;Apabila teman-teman telah mengikuti &lt;a href=&quot;#step-5---konfigurasi-project-nodejs&quot;&gt;step 5&lt;/a&gt;, maka teman-teman dipersilahkan mengikuti step ini.&lt;/p&gt;
&lt;p&gt;Tentunya kita tidak selalu membuka server atau VPS selama 24 jam ⏰ bukan? Sama aja boong kalau punya VPS, namun kita selalu buka device kita untuk mengonlinekan appnya 😂&lt;/p&gt;
&lt;p&gt;Caranya gampang banget, kita bisa menggunakan tool &lt;a href=&quot;https://pm2.io&quot;&gt;PM2&lt;/a&gt; untuk menjalankan program atau app Node.js kita di background. Gimana? Simak dibawah.&lt;/p&gt;
&lt;p&gt;Cara installnya gampang banget, perintahnya seperti dibawah ya&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i -g pm2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Untuk verifikasi instalasi dapat mengetik perintah &lt;code&gt;pm2&lt;/code&gt;, apabila muncul help info dari &lt;a href=&quot;https://pm2.io&quot;&gt;pm2&lt;/a&gt;, maka dipastikan instalasi sukses.&lt;/p&gt;
&lt;p&gt;Selanjutnya gimana? Masih di direktori project yang sama, kita jalankan perintah sebagai berikut,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pm2 start src/index.js --name &quot;Nama Project&quot;
pm2 save

pm2 startup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
&lt;code&gt;Nama Project&lt;/code&gt; bisa diganti dengan nama app sesuka hati kalian. Dan, &lt;code&gt;src/index.js&lt;/code&gt; juga bisa diganti dengan lokasi file program Node.js yang akan dijalankan (misal program yang ingin dijalankan adalah &lt;code&gt;index.js&lt;/code&gt;, maka ganti saja dengan &lt;code&gt;index.js&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Command &lt;code&gt;pm2 save&lt;/code&gt; berfungsi untuk menyimpan &lt;em&gt;state&lt;/em&gt; app yang kalian buat.&lt;/p&gt;
&lt;p&gt;Sedangkan &lt;code&gt;pm2 startup&lt;/code&gt; berfungsi untuk memberikan command kepada kita untuk dijalankan sehingga &lt;a href=&quot;https://pm2.io&quot;&gt;pm2&lt;/a&gt; akan berjalan otomatis walaupun VM di reboot.
&lt;img src=&quot;https://i.imgur.com/yJ2Nc2O.png&quot; alt=&quot;pm2 startup img&quot; /&gt;
:::&lt;/p&gt;
&lt;p&gt;Apabila sukses, akan muncul output seperti gambar dibawah
&lt;img src=&quot;https://i.imgur.com/o0HMGso.png&quot; alt=&quot;pm2 startup success&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Udah selesai? Iya udah 😎 EH-nggak dong WKWK, kita belum setup NGINX nya loh 🤩😋&lt;/p&gt;
&lt;h3&gt;Step 7 - NGINX Setup&lt;/h3&gt;
&lt;p&gt;Untuk konfigurasi NGINX-nya kita akan bagi menjadi dua, yaitu:,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Direct IP dengan SSL&lt;/li&gt;
&lt;li&gt;Domain dengan/tanpa SSL&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Direct IP dengan SSL&lt;/h4&gt;
&lt;p&gt;Tentunya sewaktu-waktu kita pengen akses app kita secara langsung tanpa harus ribet beli domain &lt;a href=&quot;https://example.com&quot;&gt;example.com&lt;/a&gt;, abcd.com, inidomain.id, dan seterusnya supaya bisa diakses dengan SSL.&lt;/p&gt;
&lt;p&gt;Secara default, jika menggunakan yang gratisan (&lt;em&gt;free&lt;/em&gt;) yakni &lt;a href=&quot;https://letsencrypt.org&quot;&gt;letsencrypt&lt;/a&gt;, jenis SSL ini hanya berfungsi pada alamat yang berdomain, dan tidak berlaku pada IP Address.&lt;/p&gt;
&lt;p&gt;Salah satu solusi yang saya temukan adalah dengan menggunakan layanan SSL gratis oleh &lt;a href=&quot;https://zerossl.com/&quot;&gt;ZeroSSL&lt;/a&gt;. Hanya dibutuhkan akun, dan alamat IP VM saja, kita bisa mendapatkan sertifikat SSL secara gratis.&lt;/p&gt;
&lt;h5&gt;ZeroSSL Verification&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Kita mendaftar/signup atau registrasi akun di &lt;a href=&quot;https://zerossl.com/&quot;&gt;ZeroSSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ketika masuk ke bagian homepage setelah registrasi akun, klik &quot;New Certificate&quot;
&lt;img src=&quot;https://i.imgur.com/MIEHn2S.png&quot; alt=&quot;new cert&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Setelah itu, teman-teman akan masuk ke halaman form validasi. Silahkan isi field &quot;Domain&quot; dengan alamat IP VPS teman-teman, dan klik &quot;Next Step&quot;
&lt;img src=&quot;https://i.imgur.com/I8uqbAH.png&quot; alt=&quot;zerossl field domain&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Selanjutnya silahkan pilih validity &quot;90-day&quot; jika ingin yang gratis. Lalu klik &quot;Next Step&quot;&lt;/li&gt;
&lt;li&gt;Untuk addons, &quot;CSR &amp;amp; Contact&quot;, dan field finalize order, kita langsung skip saja dengan klik &quot;Next Step&quot; juga.&lt;/li&gt;
&lt;li&gt;Nah, sampai juga dengan halaman verifikasi server. Kurang lebih tampilannya seperti berikut, silahkan pilih metode &quot;HTTP File Upload&quot;
&lt;img src=&quot;https://i.imgur.com/vQlONgG.png&quot; alt=&quot;zerossl verif&quot; /&gt;
&lt;img src=&quot;https://i.imgur.com/SMda75Q.png&quot; alt=&quot;zerossl http file up&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Silahkan teman-teman download file teks &quot;Download File Auth&quot;, kemudian jalankan perintah dibawah di VPSnya teman-teman&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /var/www/well-known/pki-validation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
Perintah &lt;code&gt;mkdir -p /var/www/well-known/pki-validation&lt;/code&gt; berfungsi untuk membuat directory &lt;code&gt;/var/www/well-known/pki-validation&lt;/code&gt;
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jika sudah, silahkan teman-teman copy nama filenya  dan isinya yang sudah teman-teman download tadi. Dan, jalankan perintah dibawah,&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /var/www/well-known/pki-validation/NAMA_FILE_DICOPY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
&lt;code&gt;NAMA_FILE_DICOPY&lt;/code&gt; diganti dengan nama file yang sudah dicopy tadi, jangan lupa apabila berakhiran &lt;code&gt;.txt&lt;/code&gt;, hal tersebut juga dimasukan. Intinya semua nama filenya dimasukan.
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Setelah itu, teman-teman silahkan paste isi file yang sudah dicopy tadi. Jika sudah, silahkan &lt;code&gt;CTRL+X&lt;/code&gt;, dan apabila ditanya &lt;code&gt;Save modified buffer?&lt;/code&gt;, maka ketik saja &lt;code&gt;Y&lt;/code&gt; lalu enter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jika sudah, silahkan teman-teman copy teks berikut:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; location /.well-known {
    autoindex on;
    alias /var/www/well-known;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Lalu silahkan teman-teman edit kembali file &lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt; dengan editor &lt;code&gt;nano&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/nginx/sites-available/default
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Kemudian scroll ke bawah, sehingga menemukan line seperti berikut&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;location / {
    ....
}

# isi disini
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
Silahkan ganti &lt;code&gt;# isi disini&lt;/code&gt; dengan konfigurasi yang telah dicopy sebelumnya.
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jika konfigurasi kurang lebih seperti dibawah, silahkan &lt;code&gt;CTRL+X&lt;/code&gt;, dan save. Lalu keluar.
&lt;img src=&quot;https://i.imgur.com/4r8AeX9.png&quot; alt=&quot;zerossl nginx cfg&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Kembali ke halaman verifikasi &lt;a href=&quot;https://zerossl.com&quot;&gt;ZeroSSL&lt;/a&gt;, lalu klik &quot;Next Step&quot;, dan terakhir &quot;Verify Domain&quot;&lt;/li&gt;
&lt;li&gt;Jika kamu mendapatkan gambar seperti dibawah, maka verifikasi kamu berhasil.
&lt;img src=&quot;https://i.imgur.com/5onLNS7.png&quot; alt=&quot;verifikasi done zerossl&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Jika proses pembuatan sertifikat SSL sudah selesai, silahkan pilih &quot;Server Type&quot; menjadi &lt;strong&gt;NGINX&lt;/strong&gt;, dan download file &lt;code&gt;.zip&lt;/code&gt; sertifikatnya.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;NGINX Setup&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Silahkan teman-teman copy konten file &lt;code&gt;certificate.crt&lt;/code&gt; dan &lt;code&gt;private.key&lt;/code&gt;.
:::important&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Silahkan buat file &lt;code&gt;certificate.pem&lt;/code&gt; di folder &lt;code&gt;/etc/ssl/certs&lt;/code&gt; dengan perintah sebagai berikut:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/ssl/certs/certificate.pem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lalu paste isi dari file &lt;code&gt;certificate.crt&lt;/code&gt; di file &lt;code&gt;certificate.pem&lt;/code&gt; tersebut.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lalu, lakukan hal yang sama dengan file &lt;code&gt;private.key&lt;/code&gt; seperti cara diatas.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Silahkan copy konfigurasi dibawah lalu paste ke &lt;code&gt;/etc/nginx/sites-available/app-reverse&lt;/code&gt; menggunakan editor &lt;code&gt;nano&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;server {
        listen 80;
        listen [::]:80;

        server_name IP_VPS;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name IP_VPS;

        ssl_certificate /etc/ssl/certs/certificate.pem;
        ssl_certificate_key /etc/ssl/certs/private.key;

        location / {
                proxy_pass http://127.0.0.1:5000/;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
        }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Untuk &lt;code&gt;IP_VPS&lt;/code&gt; silahkan diganti dengan IP VPSnya teman-teman.&lt;/li&gt;
&lt;li&gt;Untuk &lt;code&gt;http://127.0.0.1:5000&lt;/code&gt;, angka &lt;code&gt;5000&lt;/code&gt; bisa diganti dengan port app node.js-nya teman-teman.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Kemudian, kita akan apply changes nginx dengan cara dibawah&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/app-reverse /etc/nginx/sites-enabled/app-reverse
sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Enjoy! Sekarang IP VPS kalian bisa diakses secara langsung dengan HTTPs dan mengarah ke project Node.js-nya teman-teman 😎&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Domain dengan/tanpa SSL&lt;/h4&gt;
&lt;p&gt;Cara disini kurang lebih hampir sama dengan &lt;a href=&quot;#direct-ip-dengan-ssl&quot;&gt;ini&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;Tanpa SSL&lt;/h5&gt;
&lt;p&gt;Tanpa SSL adalah paling gampang banget, karena konfigurasinya hanya seperti ini&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    listen [::]:80;

    server_name domain_kalian.id;

    location / {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Untuk &lt;code&gt;domain_kalian.id&lt;/code&gt; silahkan diganti dengan domain milik teman-teman.&lt;/li&gt;
&lt;li&gt;Untuk &lt;code&gt;http://127.0.0.1:5000&lt;/code&gt;, angka &lt;code&gt;5000&lt;/code&gt; bisa diganti dengan port app node.js-nya teman-teman.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lalu sisa di paste ke file &lt;code&gt;/etc/nginx/sites-available/app-reverse-http&lt;/code&gt; menggunakan editor &lt;code&gt;nano&lt;/code&gt;. Kemudian jalankan perintah dibawah untuk mengaktifkannya,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/app-reverse-http /etc/nginx/sites-enabled/app-reverse-http
sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Dengan SSL&lt;/h5&gt;
&lt;p&gt;Kalau dengan SSL, gimana? Sama aja kayak &lt;a href=&quot;#domain-dengantanpa-ssl&quot;&gt;ini&lt;/a&gt;, bedanya ditambah server 443 nya doang 😋&lt;/p&gt;
&lt;p&gt;Jadi confignya gimana? Seperti dibawah ya&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    listen [::]:80;

    server_name domain_kalian.id;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name domain_kalian.id;

    ssl_certificate /etc/ssl/certs/certificate.pem;
    ssl_certificate_key /etc/ssl/certs/private.key;

    location / {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Udah gitu doang, cuman butuh SSL Certificate aja dari &lt;a href=&quot;https://letsencrypt.org&quot;&gt;LetsEncrypt&lt;/a&gt;, untuk tutorialnya bakal saya buatkan di artikel selanjutnya ✌️ (&lt;a href=&quot;/posts/05-generate-ssl-letsencrypt/&quot;&gt;Lihat Disini&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Setelah itu, sisanya sama seperti cara di &lt;a href=&quot;#domain-dengantanpa-ssl&quot;&gt;NGINX Setup Domain - Tanpa SSL&lt;/a&gt; ❤️&lt;/p&gt;
&lt;h1&gt;Penutup&lt;/h1&gt;
&lt;p&gt;Baiklah, mungkin itu saja petunjuk dan solusi yang dapat saya berikan dalam artikel ini. Dan, berikut dibawah merupakan hasil dari upaya diatas, connection ke IP VPS sudah menjadi secure karena sudah terpasang SSL certificate dari &lt;a href=&quot;https://zerossl.com&quot;&gt;ZeroSSL&lt;/a&gt;.
&lt;img src=&quot;https://i.imgur.com/7WlGGZQ.png&quot; alt=&quot;gambar jadi&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kurang lebih dan kesalahan kata, saya mohon maaf, tinggalkan komentar jika berkenan, sampai bertemu kembali di artikel selanjutnya 😋&lt;/p&gt;
</content:encoded></item><item><title>Mengapa menjadi programmer?</title><link>https://hanifu.id/posts/02-mengapa-menjadi-programmer/</link><guid isPermaLink="true">https://hanifu.id/posts/02-mengapa-menjadi-programmer/</guid><description>Alasan mengapa aku menjadi programmer? Dan apasih manfaatnya?</description><pubDate>Sat, 03 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hai, dan selamat datang. Terimakasih sudah berkunjung ke blog saya yang biasa saja 😁🙌&lt;/p&gt;
&lt;p&gt;Nah, disini aku mau bahas sedikit alasan kenapa aku milih menjadi programmer daripada yang lain serta cerita juga (agak banyakan 🤭).&lt;/p&gt;
&lt;p&gt;Programmer dipikiranku adalah seseorang yang &lt;em&gt;habit&lt;/em&gt; atau kebiasaannya ngoding dan membuat program. Welp, can we say that (programmer) is a people who code and plan the program or make the program to work?&lt;/p&gt;
&lt;p&gt;Nah, kalau orangnya udah bisa membuat atau ngerencanain dengan kode apa yang pengen dia buat, in my opinion dia udah bisa disebut programmer.&lt;/p&gt;
&lt;h1&gt;Mengapa saya menjadi Programmer?&lt;/h1&gt;
&lt;p&gt;&lt;s&gt;Karena saya butuh uang&lt;/s&gt; WKWKWK 🤣&lt;/p&gt;
&lt;p&gt;Seriously 😅, aku butuh uang atau duit sampingan untuk extend daily life aku, semisal pengen jajan, maka pake duit hasil freelance. (Loh duit ortu dikemanain?) kupakai buat membeli keperluan sekolah dan makan doang, sisanya dikeep buat next month.&lt;/p&gt;
&lt;h2&gt;Sekolah Dasar&lt;/h2&gt;
&lt;p&gt;Dan, awal mulanya juga aku ngga tahu menahu tentang &lt;strong&gt;coding&lt;/strong&gt;. Aku pelajarin hal ini ketika masih Sekolah Dasar atau SD saat beranjak kelas empat. Saat aku masih SD kelas dua hingga kelas empat, masih ada tuh namanya pelajaran &lt;strong&gt;TIK (Teknologi, Informasi, dan Komunikasi)&lt;/strong&gt; yang sarananya disediakan oleh pihak sekolah.&lt;/p&gt;
&lt;p&gt;Kalau saya melihat dari sudut pandang saya saat ini, saya bersyukur banget masih bisa mendapatkan akses belajar komputer pada waktu itu dan pada di tempat itu juga. Kalau boleh bilang, sekolah saya itu di dalam hutan ya 😁 Tetapi, masih bisa tercover jaringan (walau strengthnya lemah, 3G dan H+ itu udah bersyukur banget bisa YouTube-an)&lt;/p&gt;
&lt;p&gt;Kalau enggak salah pada tahun 2016 atau 2017 gitu, saya iseng nih coba buka network settingsnya computer di labcom di SD saya pada waktu itu, dan ke-gap sama gurunya. Ditanyain tuh,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;guru: &quot;Ngapain?&quot; (&lt;em&gt;dengan muka heran&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;saya: &quot;buka command prompt pak&quot; (&lt;em&gt;muka kaget, nervous&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;guru: &quot;loh, kamu tahu ini buat apa?&quot; (ini = command prompt)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;saya: &quot;tau pak, ini lagi dapatin password wifinya..&quot; (kurang lebih gini kata-katanya yang saya inget 🤣)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;guru: &quot;wohh, coba lihat, kalau kamu bisa, bapak kasih 90 kamu&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;saya: &quot;bayohh, oke pak&quot; (gercep nginget command yang saya pelajarin dari YouTube 🤣 Bermodalkan command &lt;strong&gt;netsh&lt;/strong&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(......sekitar 2 menitan....)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;saya: &quot;ini pak&apos;e passwordnya, bener enggak?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;guru: &quot;wahh, hebat-hebat kamu ini, coba googling, bisa nggak?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;saya: &quot;duh, harus login ini pak, bentar..&quot; (lucunya disini saya masih ngga paham networking, karena sekolah saya pake MikroTik buat manage accessnya 🤣)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dan singkat cerita saya di sekolah dasar dulu, dan saya sempet katanya mau diikutin lomba Web Design, tapi sepertinya karena masih melihat saya yang belum kompeten, jadi tidak diikutsertakan 😂😭&lt;/p&gt;
&lt;p&gt;Tak lama kemudian, aku juga mempelajari &lt;a href=&quot;https://nodejs.org&quot;&gt;Node.js&lt;/a&gt; yang pada waktu itu masih v8.x.x, yang sekarang udah melesat ke versi v22.x.x ☠️ Yah udah aku pernah ceritain juga di artikel pertama ku sih, yang berjudul &lt;strong&gt;&quot;Hello World&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mungkin langsung timeskip ke kelas sembilan Sekolah Menengah Pertama atau SMP, nah disini aku udah mulai mencari uang recehan dari freelance ngerjain web dan Rest API. Pada waktu ini tuh, sedang masa-masanya COVID-19, sehingga lebih banyak spare waktu di rumah, dan juga aku semakin memantapkan diri belajar Backend dan DevOps.&lt;/p&gt;
&lt;p&gt;Beruntungnya aku bisa join beberapa komunitas, sehingga bisa mendapat insight dan knowledge yang daging 🔥 Oh ya, aku dapatin uang jajan dari hasil freelance web developing, dan devops. Jadi, aku buat web sederhana aja untuk permintaan sederhana, dan discord bot untuk manajemen tokonya mereka di discord. Lalu, kalau DevOps lebih mengarah ke setup VPS/VM yang mereka beli dan meminta project atau appnya dijalankan. Sehingga, mereka atau client sisa akses aja.. (Biasanya yang minta seperti ini adalah mahasiswa yang ada tugas dari dosennya 😁)&lt;/p&gt;
&lt;h2&gt;Sekolah Menengah&lt;/h2&gt;
&lt;p&gt;Wih, udah gede aja nih udah masuk SMA 😃 So proud of me, Alhamdulillah karena mendapatkan ranking pertama di kelulusan atau ujian sekolah luring di SMP dalam satu angkatan, dengan rata-rata 90.25 🔥&lt;/p&gt;
&lt;p&gt;Di SMA ini aku secara singkat aja, aku lebih mendekatkan diri ke operator sekolah. Sebagai pijakan aku join ke MPK/OSIS, yang sekarang aku menjabat sebagai Ketua Koordinator SEKBID Sembilan (9) yang manage Teknologi dan Informasi (bisa dibilang sih, &lt;em&gt;babu sosmed dan dokumentasi sekolah&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Namun terlepas dari organisasi itu semua, aku juga memantapkan diri di bidang akademik (everyone can call me ugly or nerd at this moment), dan berhasil dapat attention dari guru. Yang berujung juga aku diikut sertakan dalam olimpiade (walau ga lolos, WKWKWK), atleast I got the experiences.&lt;/p&gt;
&lt;p&gt;Dan nggak lama, Maret 2023, aku coba deketin operator sekolah (kebetulan operator sekolahnya tuh adalah guru mapel yang mengajar di kelasku). Kemudian, aku coba pendekatan bertanya tentang website sekolah. Tak kunjung lama pembicaraan, akupun disuruh ke sekolah pada weekend untuk bicara dengan pengurus sebelumnya (what a good chance here 🤣)&lt;/p&gt;
&lt;p&gt;Yup, pada hari Sabtu aku ke sekolah. Dan, bertemu dengan pengurus sebelumnya (ternyata alumni juga guys 😄), sebut saja mas &lt;strong&gt;Kevin&lt;/strong&gt; (I forgot his name ☠️ I&apos;ll correct it soon). Disini, mungkin karena guruku cuman berspekulasi &lt;em&gt;&quot;ah, ini anak cuman ngaku doang, bisa ngga ya?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Welp, aku ditanyain tentang web frameworks dan tech stack lainnya. Serta common question, yakni SQL. Disini aku expect bakalin ditanyain banyak hal, ternyata enggak. Ya cuman dikenalin apa aja sih yang sekolah ini pake, dan &lt;em&gt;berapa Rp.XXX sih yang dikeluarkan sekolah&lt;/em&gt; untuk keperluan teknologi seperti ini, 🤭.&lt;/p&gt;
&lt;p&gt;Dari interview singkat itu, akupun langsung diberi akses akun cloud platform olehnya. Dan, diberi akses penuh semuanya (ibarat kata lepas tangan 🤣), saya juga ngga mempermasalahkan, karena saya udah pernah megang bendanya juga, so far ngga terlalu kaget 🙌&lt;/p&gt;
&lt;h3&gt;First Project&lt;/h3&gt;
&lt;p&gt;Ok lanjut first project aku, aku memulai projek pertama aku di sekolah ini. Bisa ditebak apa? Yap, yaitu website PPDB. Ini menurut aku proyek gelap cuy, kenapa? Proyek ini memiliki dana yang cukup banyak, namun tidak dilimpahkan sepenuhnya ke divisi yang mengerjakan.&lt;/p&gt;
&lt;p&gt;Jadi, gini ibaratnya proyek ini memiliki dana 2 digit (diatas 20jt), namun yang sampai kebawahnya cuman sepersekian juta doang (5jt-10jt).&lt;/p&gt;
&lt;p&gt;Aku disini sebagai Fullstack Programmer dan Kakak kelasku sebagai UI/UX Designer. Kita cuman dibayar makan-minum karena kerja sampai sore, kita dapat dispensasi ngga belajar dari pagi hingga sore pada waktu itu. Karena apa? Karena pada waktu tersebut merupakan se-minggu sebelum pengumuman PPDB.&lt;/p&gt;
&lt;p&gt;Secara konsep dan manajemen sangat berantakan, meetingnya mereka itu adalah dua bulan sebelum PPDB dibuka. Namun realisasi proyeknya adalah dua minggu sebelum PPDB dibuka, wild asf 🤣&lt;/p&gt;
&lt;p&gt;Gamblang aja, aku langsung gas proyek tersebut pake techstack Laravel dan Next.js. Kenapa Laravel dan Next.js? Laravel sebagai Backend dan Next.js untuk Frontend 😁🔥&lt;/p&gt;
&lt;p&gt;Jujur aja, banyak yang kritisi techstack yang aku pilih. Udah pake Next.js kok masih pake Laravel juga? Welp, Next.js disini aku fokuskan untuk Frontend dan learning curvenya juga yang ngga terlalu tinggi untuk aku yang terbiasa di Backend.&lt;/p&gt;
&lt;p&gt;Untuk kakak kelasku sendiri sebagai UI/UX designer, yang design websitenya menggunakan Figma (tysm kak Moh. Khaidir Akmal)&lt;/p&gt;
&lt;p&gt;Welp, kita pulang sampai sore, maghrib malahan. Lucky kita dikasih makan (of course, ayam geprek + ice tea everyday). Mabuk ga tuh satu minggu ayam geprek 🤤&lt;/p&gt;
&lt;p&gt;Dan ngga sampai disitu doang, sesampainya dirumah, kita juga ngerjain lagi sambil GMeet 😭. Ngerjainnya juga sampai jam dua belas malam 😄&lt;/p&gt;
&lt;p&gt;Ya minimal waktu itu tuh, satu hari bisa lima fitur lah yang jadi, aku yang handle Fullstack waktu itu untuk hosting masih aman, karena masih ada waktu dari cPanel lama, dan frontendnya pakai Vercel.&lt;/p&gt;
&lt;p&gt;Oke sesampailah pada saat mengerikan, yaitu pada hari-H PPDB. Website kita belum jadi, yakni cuman bisa login dan register doang (dalam ati, ya Allah). Dan, siangnya di sekolah udah pasang poster dan bannernya PPDB 😂&lt;/p&gt;
&lt;p&gt;Welp, jujur aja. Operator sekolah ibarat PM (Project Manager) yang nyuruh-nyuruh aja, ngasih gambaran doang, eh no, lebih ke client sih jatuhnya 😭😂&lt;/p&gt;
&lt;p&gt;There&apos;s no tech lead or someone else yang paham teknologi yang kita pake. So, aku yang handle penuh proyek ini secara technical.&lt;/p&gt;
&lt;p&gt;Jadi, aku dalam tiga hari setelah hari-H PPDB nggak tidur, full ngerjain itu website PPDB dan tiap malam gmeet conference sama kakak kelasku, dan cuman invite operator sekolah hanya dalam beberapa menit doang dia join. Dan, untungnya di hari kedua setelah pengumuman PPDB, udah bisa lah ya calon siswa baru tuh daftar biodatanya dulu 😭🔥&lt;/p&gt;
&lt;p&gt;Nah, jadi mau ngga mau harus live production (bug masih banyak banget), aku disini masih berstatus sebagai Anggota SEKBID 9, kebetulan juga megang akun sosmed sekolah. Jadi, pada saat ini notifikasi handphone dibanjiri DM adik adik karena bug form websitenya 🤣🔥☠️&lt;/p&gt;
&lt;p&gt;Oke karena ceritanya ini puanjangg bangets, aku lanjut sampai di akhir PPDB. Yup, I didnt receive sepeser pun uang. That&apos;s it! 🙏&lt;/p&gt;
&lt;p&gt;I love open-source software btw, jadi yang mau lihat kode yang saya buat bisa lihat di repo GitHub dibawah ya 🔥🙌&lt;/p&gt;
&lt;h3&gt;Back to freelance like old days&lt;/h3&gt;
&lt;p&gt;Nah semakin mendekati 2024, aku kembali freelance online seperti dulu, menerima orderan dari client yang ada di discord atau Facebook. Namun, kadang juga nyari website platform freelance, dan ngebid juga. Karena menurutku ini cara yang terbaik untuk mengais rupiah 🙌&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Pengalaman yang aku dapatkan ngga bikin aku kapok untuk menjadi programmer atau bahkan Software Engineer (Aamiin 🙌)&lt;/p&gt;
&lt;p&gt;Aku semakin tahu kalau dunia pemerintahan dan instansi itu emang gelap apa adanya. KKN itu nyata, &lt;strong&gt;Korupsi, Kolusi, dan Nepotisme&lt;/strong&gt; 🔥&lt;/p&gt;
&lt;p&gt;Dan, semakin aku lihat perkembangan teknologi, semakin pesat berjalannya waktu, aku yakin masih tertinggal jauh. Sebab oleh itu, aku terus memilih belajar dan terus belajar walau kelas dua belas saat ini mengkompres waktuku untuk itu, aku percaya bahwa tiap orang ada masanya, tiap orang berproses, tiada yang instan, dan itu yang memang terjadi 🙂&lt;/p&gt;
</content:encoded></item><item><title>Hello World</title><link>https://hanifu.id/posts/01-hello/</link><guid isPermaLink="true">https://hanifu.id/posts/01-hello/</guid><description>Hello World, this is my first post on this blog. And who am I?</description><pubDate>Sun, 28 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hello World&lt;/h1&gt;
&lt;h2&gt;Who am I?&lt;/h2&gt;
&lt;p&gt;I am Hanif Dwy Putra S, commonly called &lt;strong&gt;Hanif&lt;/strong&gt;, &lt;strong&gt;Hans&lt;/strong&gt;, &lt;strong&gt;Nif&lt;/strong&gt;, &lt;strong&gt;Nip&lt;/strong&gt;. Now, I&apos;m seventeen years old (17 years),
I live in Palu, Central Sulawesi, Indonesia. I&apos;m a student and work as IT Support Technician (&lt;em&gt;unpaid&lt;/em&gt;) at
&lt;a href=&quot;https://sman3palu.sch.id&quot;&gt;SMA Negeri 3 Palu&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Histories&lt;/h2&gt;
&lt;h3&gt;Elementary School Part 01 - The first step where I love code.&lt;/h3&gt;
&lt;p&gt;I&apos;ve loved technology since the fourth grade of elementary school in 2017.
The first technology I learned was &lt;a href=&quot;https://nodejs.org&quot;&gt;Node.js&lt;/a&gt;, which was v8.x that year.&lt;/p&gt;
&lt;p&gt;I didn&apos;t have programming skills or any of my family knew about this tech knowledge. I learned it because
I was interested in &lt;a href=&quot;https://discord.com&quot;&gt;Discord&lt;/a&gt; bots, I really wanted to know how to build and program them.&lt;/p&gt;
&lt;p&gt;The first community I learned &lt;a href=&quot;https://nodejs.org&quot;&gt;Node.js&lt;/a&gt; from was &lt;strong&gt;Garuda&lt;/strong&gt; (arguably now abandoned and changed ownership), they taught me how to code from the basics, such as &lt;em&gt;“how to install Visual Studio Code”, “how to install Node.js”, and “how to fix syntax issues in general”&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Elementary School Part 02 - The second step where I really interest in algorithm and logics.&lt;/h3&gt;
&lt;p&gt;So, in grade five and grade six of elementary school in 2018. I started to get interested in algorithms and programming logic, at this stage I really enjoyed programming logic which helped me with my homework (especially math). And, I was able to create my own website to expose my daily activities and a simple CRUD website using PHP (I created it with &lt;em&gt;Samsung Tab 3T Lite Galaxy&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;In this year, it was my first time learning &lt;a href=&quot;https://java.com&quot;&gt;Java&lt;/a&gt; and &lt;a href=&quot;https://docker.com&quot;&gt;Docker&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Junior High School - Hello Python and DevOps!&lt;/h3&gt;
&lt;p&gt;Okkkayyy, in middle school I have so many stories to tell. But, I will say that in this year I learned a lot of
technology stack. Like &lt;a href=&quot;https://python.org&quot;&gt;Python&lt;/a&gt;, &lt;a href=&quot;https://docker.com&quot;&gt;Docker&lt;/a&gt;, &lt;a href=&quot;https://java.com&quot;&gt;Java&lt;/a&gt;, &lt;a href=&quot;https://kotlinlang.org/&quot;&gt;Kotlin&lt;/a&gt;, and many moreeee....&lt;/p&gt;
&lt;p&gt;So, why does the title of this section say &lt;em&gt;“Hello Python and DevOps!”&lt;/em&gt;?
Because this year, I joined &lt;a href=&quot;https://raznar.id&quot;&gt;Raznar&lt;/a&gt; which is the cheapest/affordable and high-performance hosting. You can host anything here, like game hosting, app hosting, or maybe you need a VM server? &lt;a href=&quot;https://raznar.id&quot;&gt;Raznar&lt;/a&gt; is the best for you.&lt;/p&gt;
&lt;p&gt;Okay, enough promotion, lol. At &lt;a href=&quot;https://raznar.id&quot;&gt;Raznar&lt;/a&gt; I learned many things about DevOps, such as how to manage containers and images in &lt;a href=&quot;https://docker.com&quot;&gt;Docker&lt;/a&gt;, how to handle traffic on proxy servers, setting up CI/CD, load balancing, horizontal scaling, etc...&lt;/p&gt;
&lt;p&gt;Well, I also learned web scraping. I like how service providers hide their API services that are being scraped from us,
and we have to analyze or reverse engineer their application to sniff the service URL. Usually, I use &lt;a href=&quot;https://https://portswigger.net/burp&quot;&gt;BurpSuite&lt;/a&gt;, and other Python libraries.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;Here is the one of web scraping projects&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;h3&gt;High School - Hi?&lt;/h3&gt;
&lt;p&gt;I&apos;m so tired when I wrote this article btw. See you next time!&lt;/p&gt;
</content:encoded></item></channel></rss>