[{"content":"Apa Itu Port Forwarding? Port Forwarding adalah teknik jaringan yang memungkinkan perangkat dari luar jaringan lokal (internet) untuk mengakses layanan/server yang berjalan di dalam jaringan lokal kamu. Secara sederhana, port forwarding adalah cara \u0026ldquo;membuka pintu\u0026rdquo; tertentu di router agar traffic dari luar bisa diteruskan ke perangkat spesifik di jaringan internal.\nKenapa Perlu Port Forwarding? Karena router kamu menggunakan NAT (Network Address Translation).\nBagaimana NAT Bekerja? IP Publik → dimiliki oleh router (diberikan oleh ISP), ini adalah alamat yang terlihat dari internet. IP Private → digunakan oleh perangkat di dalam jaringan lokal kamu (contoh: 192.168.x.x, 10.x.x.x). NAT bertugas menerjemahkan IP Private ke IP Publik saat perangkat lokal mengakses internet. Namun, secara default traffic dari luar tidak bisa masuk ke perangkat lokal karena router tidak tahu harus meneruskan ke perangkat mana.\nPort Forwarding menyelesaikan masalah ini dengan memberi tahu router:\n\u0026ldquo;Jika ada traffic masuk di port X, teruskan ke perangkat Y di jaringan lokal pada port Z.\u0026rdquo;\nContoh Penggunaan: Mengakses web server lokal dari internet Menjalankan game server yang bisa diakses teman Remote access ke CCTV/IP Camera dari luar rumah Mengakses NAS (Network Attached Storage) dari mana saja Menjalankan SSH server agar bisa remote ke komputer rumah Masalah CGNAT (Carrier Grade NAT) Apa Itu CGNAT? Banyak ISP di Indonesia seperti Telkom IndiHome, Biznet, MyRepublic, XL, Smartfren, dan lainnya menggunakan CGNAT (Carrier Grade NAT).\nCGNAT adalah lapisan NAT tambahan yang dilakukan di sisi ISP. Artinya, sebelum traffic sampai ke router kamu, sudah ada proses NAT di level ISP.\nDampak CGNAT: ❌ Kamu tidak bisa melakukan Port Forwarding secara normal ❌ Bahkan kalau sudah di-forward di router kamu, orang luar tetap tidak bisa mengakses ❌ IP Publik yang kamu dapat dipakai bersama dengan pelanggan lain (shared IP) Cara Mengecek Apakah ISP Kamu Pakai CGNAT Langkah 1: Cek IP Publik kamu dari internet\nBuka whatismyipaddress.com atau jalankan perintah:\ncurl ifconfig.me Langkah 2: Cek IP yang tertera di modem/router kamu\nLogin ke halaman admin router (biasanya 192.168.1.1 atau 192.168.0.1), lalu lihat IP WAN.\nKesimpulan:\nJika IP Publik dari internet = IP WAN di router → ✅ Kamu tidak kena CGNAT, port forwarding bisa dilakukan Jika IP Publik dari internet ≠ IP WAN di router → ❌ Kamu kena CGNAT, perlu solusi alternatif Solusi jika kena CGNAT:\nHubungi ISP untuk minta IP Publik statis/dinamis (beberapa ISP menyediakan dengan biaya tambahan) Gunakan layanan tunneling seperti Cloudflare Tunnel, Ngrok, atau Tailscale Gunakan VPN dengan port forwarding (contoh: WireGuard pada VPS) Tutorial Port Forwarding di Router Jika kamu sudah memastikan tidak kena CGNAT, berikut langkah-langkah melakukan port forwarding:\nLangkah 1: Masuk ke Menu Forward Rules Login ke halaman admin router, lalu navigasi ke menu Forward Rules atau Port Forwarding (nama menu bisa berbeda tergantung merek router).\nLangkah 2: Buat Rule Forward Buat rule baru untuk menentukan:\nLangkah 3: Verifikasi Sebelum Port Forward Sebelum port forwarding aktif, lakukan scan dengan nmap ke IP Publik untuk melihat kondisi awal:\nnmap \u0026lt;IP_PUBLIK_KAMU\u0026gt; Terlihat port yang dituju masih tertutup/filtered karena belum ada rule forwarding.\nLangkah 4: Verifikasi Setelah Port Forward Setelah rule forwarding diaktifkan, scan ulang dengan nmap:\nnmap \u0026lt;IP_PUBLIK_KAMU\u0026gt; Sekarang port yang di-forward sudah terlihat open ✅\nLangkah 5: Akses dari Luar Coba akses layanan melalui IP Publik dari jaringan luar (bisa pakai data seluler atau minta teman mengecek):\n🎉 Berhasil! Layanan di jaringan lokal sudah bisa diakses dari internet.\nPort Mapping (Advance) Port Mapping adalah fitur lanjutan yang memungkinkan kamu memetakan port eksternal ke port internal yang berbeda. Ini berguna ketika:\nKamu ingin menyembunyikan port asli layanan (keamanan) Menjalankan beberapa layanan serupa di port yang berbeda Port standar sudah digunakan oleh layanan lain Langkah 1: Masuk ke Menu Port Mapping Navigasi ke menu Port Mapping pada router (biasanya ada di bagian Advanced/NAT settings).\nLangkah 2: Deploy Port Mapping Konfigurasikan port mapping sesuai kebutuhan, lalu simpan dan terapkan konfigurasi.\nPort eksternal → port yang dibuka dari sisi internet IP tujuan → IP perangkat lokal yang ingin diakses Port internal → port layanan di perangkat lokal Protokol → TCP, UDP, atau keduanya Langkah 3: Verifikasi Port Mapping Cek apakah port mapping sudah terbaca dengan benar menggunakan nmap:\nnmap \u0026lt;IP_PUBLIK_KAMU\u0026gt; -p \u0026lt;PORT_YANG_DIMAPPING\u0026gt; Port mapping berhasil diterapkan dan terdeteksi oleh nmap ✅\nRingkasan Aspek Keterangan Port Forwarding Membuka port di router agar traffic luar bisa masuk ke perangkat lokal NAT Menerjemahkan IP Private ↔ IP Publik CGNAT NAT tambahan di sisi ISP, menghalangi port forwarding normal Cek CGNAT Bandingkan IP di whatismyipaddress.com dengan IP WAN di router Port Mapping Memetakan port eksternal ke port internal yang berbeda Tool Verifikasi Gunakan nmap untuk memastikan port sudah terbuka ⚠️ Tips Keamanan:\nHanya forward port yang benar-benar diperlukan Gunakan port non-standar jika memungkinkan Pastikan layanan yang di-forward sudah diamankan (password, firewall, SSL/TLS) Monitor log akses secara berkala ","permalink":"https://blog.bahrani.my.id/docs/catatan/portforwarding/","summary":"\u003ch2 id=\"apa-itu-port-forwarding\"\u003eApa Itu Port Forwarding?\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ePort Forwarding\u003c/strong\u003e adalah teknik jaringan yang memungkinkan perangkat dari luar jaringan lokal (internet) untuk mengakses layanan/server yang berjalan di dalam jaringan lokal kamu. Secara sederhana, port forwarding adalah cara \u003cstrong\u003e\u0026ldquo;membuka pintu\u0026rdquo;\u003c/strong\u003e tertentu di router agar traffic dari luar bisa diteruskan ke perangkat spesifik di jaringan internal.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"kenapa-perlu-port-forwarding\"\u003eKenapa Perlu Port Forwarding?\u003c/h2\u003e\n\u003cp\u003eKarena router kamu menggunakan \u003cstrong\u003eNAT (Network Address Translation)\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"bagaimana-nat-bekerja\"\u003eBagaimana NAT Bekerja?\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eIP Publik\u003c/strong\u003e → dimiliki oleh router (diberikan oleh ISP), ini adalah alamat yang terlihat dari internet.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIP Private\u003c/strong\u003e → digunakan oleh perangkat di dalam jaringan lokal kamu (contoh: \u003ccode\u003e192.168.x.x\u003c/code\u003e, \u003ccode\u003e10.x.x.x\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNAT bertugas menerjemahkan IP Private ke IP Publik saat perangkat lokal mengakses internet. Namun, \u003cstrong\u003esecara default traffic dari luar tidak bisa masuk\u003c/strong\u003e ke perangkat lokal karena router tidak tahu harus meneruskan ke perangkat mana.\u003c/p\u003e","title":"Port Forwarding"},{"content":"Halo teman-teman! 👋\nPernah nggak sih, kamu mau share file besar, tapi VPS mahal, storage terbatas, atau takut link Google Drive susah dicari? Saya juga pernah. 😅\nNah, dari pengalaman itu, lahirlah FileDrive Portal — sebuah landing page modern bergaya HFS (HTTP File Server) yang memungkinkan kamu share file besar dengan cepat, aman, dan GRATIS, tanpa perlu server atau hosting berbayar.\nTampilan UI sudah jadi\n🚀 Live Demo: Kamu bisa melihat langsung hasil jadinya dan mencoba mengakses portal ini melalui tautan berikut:\nhttps://file.bahrani.my.id/\nSelain itu, kami menyediakan folder khusus di Google Drive untuk dibagikan. Jadi, kalau kamu ingin share file, tinggal pindahkan (move) file ke folder ini, dan file otomatis muncul di website untuk diakses orang lain. Setelah selesai, tinggal kembalikan file ke lokasi asal, sehingga file tetap tersimpan rapi di Drive kamu tanpa hilang atau tercampur. 🎉\nTampilan google drive\n🔍 Masalah yang Sering Dihadapi Biasanya kalau mau share file besar, kita menghadapi beberapa kendala:\nGoogle Drive kadang link-nya panjang dan susah dicari Banyak layanan gratis membatasi ukuran upload User experience kurang nyaman: nggak ada live search, sorting, atau tombol copy link FileDrive Portal hadir untuk menghilangkan semua kerepotan itu, sekaligus memberi UX premium untuk orang yang ingin akses file.\n✨ Solusi dari FileDrive Portal Dengan FileDrive Portal, kamu bisa:\nUpload file ke Google Drive → otomatis muncul di website Cari file dengan live search dan sort smartly Copy link dengan satu klik, lengkap dengan toast notification Folder khusus untuk share: move → tampil online → kembalikan ke lokasi asal, sehingga file tersimpan rapi Semua orang bisa mengakses folder share secara langsung Google Apps Script menyediakan endpoint JSON untuk membaca isi folder dan ditampilkan di frontend Dengan cara ini, membagikan file besar jadi mudah, aman, dan cepat. 😎\n🛠️ Teknologi di Baliknya Sebelum masuk ke langkah instalasi, kenalan dulu sama “mesin” FileDrive Portal:\nFrontend: HTML5 + CSS3 + Vanilla JS (ES6+) Backend: Google Drive API via Google Apps Script (JSON endpoint) Hosting: GitHub Pages uji coba Script google Cript\n","permalink":"https://blog.bahrani.my.id/docs/catatan/filedrive/","summary":"\u003cp\u003eHalo teman-teman! 👋\u003cbr\u003e\nPernah nggak sih, kamu mau share file besar, tapi VPS mahal, storage terbatas, atau takut link Google Drive susah dicari? Saya juga pernah. 😅\u003c/p\u003e\n\u003cp\u003eNah, dari pengalaman itu, lahirlah \u003cstrong\u003eFileDrive Portal\u003c/strong\u003e — sebuah landing page modern bergaya HFS (\u003cem\u003eHTTP File Server\u003c/em\u003e) yang memungkinkan kamu \u003cstrong\u003eshare file besar dengan cepat, aman, dan GRATIS\u003c/strong\u003e, tanpa perlu server atau hosting berbayar.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Tampilan UI sudah jadi\" loading=\"lazy\" src=\"/img/drive/2026-05-15_170658.png\"\u003e\n\u003cem\u003eTampilan UI sudah jadi\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e🚀 Live Demo:\u003c/strong\u003e Kamu bisa melihat langsung hasil jadinya dan mencoba mengakses portal ini melalui tautan berikut:\u003cbr\u003e\n\u003cstrong\u003e\u003ca href=\"https://file.bahrani.my.id/\"\u003ehttps://file.bahrani.my.id/\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e","title":"📦 FileDrive Portal: Cara Praktis Bagikan File Besar Tanpa Ribet"},{"content":"Dari SSH ke Server, Sekarang Saatnya Otomasi! Di artikel sebelumnya, kita sudah berhasil SSH ke server lokal dari mana saja lewat internet menggunakan Cloudflare Tunnel. Sekarang server lokal kita bisa dijangkau dari mana saja. Tapi ada satu masalah lagi…\nBayangkan kamu punya project — bisa jadi aplikasi web, API, atau script kecil — yang kode-nya kamu taruh di GitLab. Setiap kali kamu update kode, kamu harus:\nSSH ke server git pull untuk ambil kode terbaru Build aplikasi (kalau perlu) Restart service Ulangi itu setiap kali ada perubahan. Capek, kan? Apalagi kalau kamu deploy beberapa kali sehari.\nNah, di sinilah CI/CD masuk!\nApa Itu CI/CD? Sebelum praktik, pahami dulu konsepnya dengan analogi sederhana.\nBayangkan kamu punya restoran:\nCI (Continuous Integration) itu seperti kitchen quality check — setiap kali chef baru masak, makanannya otomatis dicek rasanya, kebersihannya, dan presentasinya. Kalau ada yang salah, langsung ditolak sebelum sampai ke pelanggan. CD (Continuous Deployment/Delivery) itu seperti waiter otomatis — begitu makanan lolos quality check, waiter langsung mengantarkannya ke meja pelanggan tanpa perlu disuruh. Dalam dunia software:\nCI = Setiap kali kamu push kode ke Git, sistem otomatis menjalankan test dan build untuk memastikan kode tidak error CD = Kalau test dan build berhasil, sistem otomatis deploy ke server tanpa campur tangan kamu Jadi alurnya jadi gini:\nKamu push kode → GitLab terima → Otomatis test \u0026amp; build → Otomatis deploy ke server → Selesai! Kenapa Pakai CI/CD di Server Lokal? Beberapa orang mungkin berpikir, \u0026ldquo;CI/CD itu kan buat perusahaan besar, buat apa di server lokal?\u0026rdquo;\nEits, jangan salah! CI/CD itu sangat berguna bahkan untuk project kecil:\n🚀 Hemat waktu — tidak perlu manual deploy setiap kali update 🔒 Konsisten — proses deploy selalu sama, tidak ada langkah yang terlewat 🐛 Deteksi error lebih cepat — kalau kode bermasalah, langsung ketahuan saat build 📋 Riwayat deploy jelas — tahu kapan dan apa yang di-deploy 😌 Tenang — push kode, duduk manis, server yang kerja Apa yang Kita Butuhkan? Sebelum mulai, pastikan kamu sudah punya:\nServer lokal yang sudah bisa di-SSH (lihat artikel sebelumnya tentang Cloudflare Tunnel) Project yang sudah di-push ke GitLab Akses Maintainer/Owner ke repository GitLab Terminal di server lokal Langkah 1: Pilih Project yang Mau Diterapkan CI/CD Pertama, buka GitLab dan pilih project yang mau kamu terapkan CI/CD. Bisa project baru atau project yang sudah ada.\nLangkah 2: Buka Settings untuk Aktifkan CI/CD Setelah masuk ke project, pergi ke bagian Settings lalu cari menu CI/CD. Di sinilah kita akan mengatur runner untuk project ini.\nLangkah 3: Buat Runner Baru Di halaman CI/CD Settings, cari bagian Runners lalu klik untuk membuat runner baru. Runner ini yang nanti akan menjalankan pipeline CI/CD di server lokal kamu.\nLangkah 4: Beri Nama Runner Kasih nama untuk runner kamu. Misalnya server-lokal atau nama lain yang mudah dikenali. Nama ini akan muncul di GitLab supaya kamu tahu runner mana yang sedang bekerja.\nLangkah 5: Pilih Sistem Operasi Runner Pilih sistem operasi di mana runner akan dijalankan. Sesuaikan dengan OS server lokal kamu — misalnya Linux, macOS, atau Windows.\nLangkah 6: Copy Perintah Instalasi Runner GitLab akan menampilkan perintah untuk mendownload dan menginstall runner. Copy perintah-perintah tersebut — kita akan menjalankannya di server lokal.\nLangkah 7: Jalankan Perintah di Server — Cek Runner Sudah Terinstall SSH ke server lokal kamu, lalu jalankan perintah-perintah yang sudah di-copy tadi satu per satu. Setelah selesai, pastikan runner sudah berhasil terinstall:\ngitlab-runner --version Langkah 8: Paste Token untuk Registrasi Runner Saat proses registrasi, kamu akan diminta memasukkan token yang kamu dapat dari GitLab. Token ini menghubungkan runner di server kamu dengan project di GitLab.\nsudo gitlab-runner register Masukkan token dan informasi yang diminta:\nGitLab URL: biasanya https://gitlab.com Token: paste token dari GitLab Executor: pilih shell (supaya bisa langsung menjalankan command di server) Langkah 9: Runner Berjalan! Setelah registrasi berhasil, jalankan runner:\nsudo gitlab-runner start Kalau tidak ada error, runner sudah berjalan di server lokal kamu!\nLangkah 10: Cek di GitLab — Pasti Ada New Runner! Buka kembali halaman Settings → CI/CD → Runners di GitLab. Runner kamu seharusnya sudah muncul di sana dengan status aktif. Kalau muncul, berarti server lokal kamu sudah terhubung dengan GitLab!\nLangkah 11: Pastikan Runner Online dan Terdaftar Sebelum lanjut, pastikan runner menunjukkan status online (ikon hijau). Kalau offline, coba restart runner di server:\nsudo gitlab-runner restart Langkah 12: Buat Workflow File Sekarang runner sudah siap. Saatnya membuat workflow file — file yang mendefinisikan apa yang harus dilakukan CI/CD setiap kali ada push.\nDi root project kamu, buat file:\n.gitlab-ci.yml Contoh isi file:\nstages: - deploy deploy: stage: deploy only: - main script: - cd /path/to/project - git pull origin main - # Tambahkan perintah build di sini, misalnya: - # npm install \u0026amp;\u0026amp; npm run build - # atau: docker compose up -d --build - sudo systemctl restart aplikasi tags: - server-lokal Penjelasan:\nonly: main → Pipeline hanya berjalan saat ada push ke branch main script → Command yang dijalankan di server lokal tags: server-lokal → Pastikan pipeline dijalankan oleh runner yang sudah kita buat Langkah 13: Push ke GitLab Setelah file .gitlab-ci.yml selesai, commit dan push ke GitLab:\ngit add .gitlab-ci.yml git commit -m \u0026#34;Tambah CI/CD pipeline\u0026#34; git push origin main Langkah 14: Pipeline Berjalan! Buka project di GitLab dan pergi ke CI/CD → Pipelines. Kamu akan melihat pipeline sedang berjalan! GitLab otomatis mendeteksi file .gitlab-ci.yml dan mulai mengeksekusi perintah-perintah yang kita tulis.\nLangkah 15: Lihat Detail Pipeline Klik pipeline yang sedang berjalan untuk melihat detail. Kamu bisa lihat stage apa saja yang dijalankan dan status masing-masing — apakah sedang running, berhasil, atau gagal.\nLangkah 16: Log di Server — Berhasil Dieksekusi Klik job di pipeline untuk melihat log output secara real-time. Di sini kamu bisa lihat command apa saja yang dijalankan oleh runner di server lokal, dan apakah semuanya berhasil tanpa error.\nLangkah 17: Pastikan Runner Bisa Menjalankan Command di Workflow Penting untuk memastikan bahwa runner bisa menjalankan semua command yang ada di workflow. Kalau ada command yang gagal (misalnya permission denied), cek user yang menjalankan gitlab-runner dan pastikan punya akses yang cukup:\nsudo usermod -aG docker gitlab-runner # kalau pakai docker sudo chown -R gitlab-runner:gitlab-runner /path/to/project Langkah 18: Lihat Status di Pipeline — Deploy Kembali ke halaman pipeline, status deploy akan berubah menjadi running (icon biru berputar) saat sedang berjalan.\nLangkah 19: Deploy Selesai dan Berhasil! 🎉 Kalau semua langkah berhasil, status pipeline akan berubah menjadi passed (ikon hijau ✅). Artinya kode sudah berhasil di-deploy ke server lokal kamu secara otomatis!\nLangkah 20: Verifikasi Deploy di Server Terakhir, verifikasi di server lokal bahwa kode terbaru sudah benar-benar ter-deploy. Cek file, versi aplikasi, atau langsung test aplikasinya.\nKesimpulan Dengan menerapkan CI/CD di server lokal menggunakan GitLab Runner, proses deploy yang tadinya manual dan membosankan sekarang jadi sepenuhnya otomatis.\nRingkasan langkah-langkahnya:\nPilih project di GitLab dan buka Settings → CI/CD Buat runner baru dan kasih nama Copy perintah instalasi, jalankan di server lokal Registrasi runner dengan token dari GitLab Buat workflow file .gitlab-ci.yml Push kode dan biarkan pipeline yang bekerja! Keuntungannya:\n⏱️ Hemat waktu — push kode, sisanya otomatis 🔧 Konsisten — setiap deploy mengikuti proses yang sama 🐛 Deteksi error cepat — gagal build = gagal deploy, langsung ketahuan 📊 Riwayat jelas — semua deployment terekam di GitLab Pipelines 💰 Gratis — self-hosted runner tidak ada biaya tambahan Dari artikel sebelumnya kita bisa akses server lokal dari mana saja, sekarang kita bisa deploy dari mana saja juga. Cukup push kode dari laptop, HP, atau komputer mana pun — server lokal kamu akan otomatis update sendiri. Praktis banget! 🚀\n","permalink":"https://blog.bahrani.my.id/docs/catatan/ci-cd/","summary":"\u003ch2 id=\"dari-ssh-ke-server-sekarang-saatnya-otomasi\"\u003eDari SSH ke Server, Sekarang Saatnya Otomasi!\u003c/h2\u003e\n\u003cp\u003eDi artikel sebelumnya, kita sudah berhasil \u003cstrong\u003eSSH ke server lokal dari mana saja lewat internet\u003c/strong\u003e menggunakan Cloudflare Tunnel. Sekarang server lokal kita bisa dijangkau dari mana saja. Tapi ada satu masalah lagi…\u003c/p\u003e\n\u003cp\u003eBayangkan kamu punya project — bisa jadi aplikasi web, API, atau script kecil — yang kode-nya kamu taruh di GitLab. Setiap kali kamu update kode, kamu harus:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSSH ke server\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit pull\u003c/code\u003e untuk ambil kode terbaru\u003c/li\u003e\n\u003cli\u003eBuild aplikasi (kalau perlu)\u003c/li\u003e\n\u003cli\u003eRestart service\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eUlangi itu \u003cstrong\u003esetiap kali\u003c/strong\u003e ada perubahan. Capek, kan? Apalagi kalau kamu deploy \u003cstrong\u003ebeberapa kali sehari\u003c/strong\u003e.\u003c/p\u003e","title":"Penerapan CI/CD pada Server Lokal"},{"content":"Pernah Bingung Bagaimana Cara Akses Server Lokal dari Jauh? Bayangkan kamu punya server lokal di rumah atau di kantor. Server itu jalan baik, tapi masalahnya — kamu cuma bisa akses saat berada di jaringan yang sama. Mau akses dari kafe, dari rumah teman, atau dari mana saja lewat internet? Tidak bisa.\nSecara default, server lokal itu \u0026ldquo;tersembunyi\u0026rdquo; di balik jaringan lokal (LAN). Dia tidak punya alamat publik yang bisa dijangkau dari internet. Belum lagi kalau kamu pakai ISP rumahan yang ganti-ganti IP publik (dynamic IP), atau bahkan di-NAT sehingga kamu tidak bisa langsung port-forward.\nNah, bayangkan kalau kamu bisa akses server lokal itu dengan nama domain, dari mana saja di dunia ini, selama ada koneksi internet:\nssh user@serverkamu.com Keren, kan? Di artikel ini, kita akan bahas cara membuatnya terwujud menggunakan Cloudflare Zero Trust Tunnel.\nKonsep Dasar: Cloudflare Zero Trust Tunnel Sebelum masuk ke praktik, mari kita pahami konsepnya dengan analogi sederhana.\nBayangkan server lokal kamu itu seperti rumah pribadi yang terletak di gang kecil — tidak ada alamat resmi yang bisa dicari di Google Maps. Teman kamu yang mau berkunjung pasti bingung nyarinya.\nCloudflare Tunnel itu seperti kamu memasang \u0026ldquo;portal ajaib\u0026rdquo; di dalam rumah kamu. Portal ini terhubung langsung ke Cloudflare (sebuah platform besar yang punya alamat jelas di internet). Jadi teman kamu tidak perlu tahu di mana rumah kamu yang sebenarnya — mereka cukup datang ke alamat Cloudflare, dan Cloudflare akan meneruskan mereka melalui portal ajaib itu langsung ke rumah kamu.\nGimana Cara Kerjanya? Cloudflare Tunnel (cloudflared) berjalan di server lokal kamu Tunnel ini membuat koneksi outbound (keluar) dari server kamu menuju jaringan Cloudflare Cloudflare memberikan kamu sebuah domain (misalnya serverkamu.com) Ketika seseorang mengakses domain itu, Cloudflare meneruskan traffic-nya melalui tunnel ke server lokal kamu Tidak perlu buka port, tidak perlu IP publik static, dan tidak perlu setting port-forwarding di router! Apa yang Kita Butuhkan? Sebelum mulai, pastikan kamu sudah punya:\nServer lokal yang sudah berjalan dan terhubung ke internet (tidak perlu IP publik!) SSH Server sudah terinstall di server tersebut Akun Cloudflare (gratis bisa!) dengan sebuah domain yang sudah ditambahkan Akses terminal di server lokal untuk menginstall cloudflared Keuntungan besar: Karena tunnel bekerja secara outbound, kamu tidak perlu membuka port di router, tidak perlu IP publik static, dan server kamu tetap aman karena tidak terekspos langsung ke internet.\nLangkah 1: Setup Cloudflare Zero Trust Pertama, kita perlu setup Cloudflare Zero Trust. Login ke dashboard Cloudflare, lalu:\nBuka menu Zero Trust di sidebar Buat sebuah Team Name untuk organisasi kamu Pilih plan Free (sudah cukup untuk kebutuhan ini) Langkah 2: Buat Tunnel Setelah Zero Trust aktif, saatnya membuat tunnel:\nDi dashboard Zero Trust, buka Networks → Tunnels Klik Create a tunnel Pilih tipe Cloudflared Beri nama tunnel kamu, misalnya server-lokal Cloudflare akan memberikan sebuah token — simpan baik-baik token ini! Langkah 3: Install Cloudflared di Server Lokal Sekarang kita install cloudflared di server lokal. SSH ke server kamu (masih lewat jaringan lokal) dan jalankan:\nDi Ubuntu/Debian: sudo apt update sudo apt install cloudflared Atau kalau tidak tersedia di repository, bisa install manual:\n# Download dan install curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb sudo dpkg -i cloudflared.deb Di CentOS/RHEL: curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.rpm -o cloudflared.rpm sudo rpm -i cloudflared.rpm Langkah 4: Jalankan Tunnel di Server Setelah cloudflared terinstall, saatnya menghubungkan server ke Cloudflare. Gunakan token yang kamu dapat dari Langkah 2:\nsudo cloudflared service install eyJh...token_kamu_disini... Perintah ini akan mendaftarkan cloudflared sebagai service yang berjalan otomatis di background.\nCek status tunnel:\nsudo systemctl status cloudflared Pastikan statusnya active (running). Kalau iya, berarti server lokal kamu sudah terhubung ke Cloudflare! 🎉\nLangkah 5: Konfigurasi Public Hostname (Route SSH) Sekarang kita perlu memberi tahu Cloudflare kemana harus meneruskan traffic SSH. Kembali ke dashboard Cloudflare Zero Trust:\nDi halaman tunnel yang sudah dibuat, klik Configure Buka tab Public Hostname Klik Add a public hostname\nIsi konfigurasi:\nSubdomain: ssh (atau sesuai keinginan kamu) Domain: pilih domain kamu yang sudah terdaftar di Cloudflare Service Type: pilih SSH URL: localhost:22 (atau IP lokal server dan port SSH kamu) Klik Save\nSekarang domain ssh.domainkamu.com sudah terhubung ke server SSH lokal kamu melalui tunnel! Langkah 6: Test SSH Pertama — Masih Gagal! 😅 Dari komputer client, coba akses server menggunakan domain:\nssh user@ssh.domainkamu.com Tapi\u0026hellip; hasilnya malah gagal. Kenapa?\nTenang, ini normal! Cloudflare Tunnel untuk SSH tidak bisa langsung dipakai seperti SSH biasa. Kita perlu mengatur ProxyCommand di komputer client supaya SSH tahu harus melewati Cloudflare Tunnel terlebih dahulu. Tanpa ProxyCommand, SSH client tidak mengerti cara merutekan koneksi melalui Cloudflare.\nLangkah 7: Konfigurasi ProxyCommand di SSH Client Supaya SSH bisa lewat Cloudflare Tunnel, kita perlu edit file SSH Config di komputer client (bukan di server):\nnano ~/.ssh/config Tambahkan konfigurasi berikut:\nHost ssh.domainkamu.com ProxyCommand cloudflared access ssh --hostname %h Apa itu ProxyCommand? Singkatnya, ini memberi tahu SSH: \u0026ldquo;Sebelum koneksi ke server, lewati dulu cloudflared biar bisa tembus ke server lokal.\u0026rdquo;\nJadi setiap kali kamu SSH ke ssh.domainkamu.com, komputer akan otomatis menjalankan cloudflared access ssh sebagai perantara.\nCatatan: Pastikan cloudflared juga sudah terinstall di komputer client yang kamu gunakan untuk SSH. Cara install-nya sama seperti di Langkah 3.\nLangkah 8: SSH Ulang — Sekarang Berhasil! 🎉 Sekarang coba SSH lagi dari komputer client:\nssh user@ssh.domainkamu.com Kali ini SSH berjalan melalui Cloudflare Tunnel, dan koneksi berhasil masuk!\nKamu akan diminta memasukkan password server lokal seperti biasa:\nDan\u0026hellip; berhasil masuk! 🎉\nServer lokal di rumah kamu sekarang bisa diakses dari mana saja di dunia melalui internet, menggunakan nama domain. Tidak perlu buka port, tidak perlu IP publik static, dan koneksi terenkripsi end-to-end oleh Cloudflare.\nKesimpulan Dengan Cloudflare Zero Trust Tunnel, server lokal kamu yang tadinya hanya bisa diakses dari jaringan lokal, sekarang bisa diakses dari mana saja lewat internet menggunakan domain.\nLangkah-langkahnya ringkas:\nSetup Cloudflare Zero Trust dan buat Tunnel Install cloudflared di server lokal dan jalankan tunnel Konfigurasi Public Hostname dengan tipe SSH Di komputer client, tambahkan ProxyCommand di SSH Config SSH via domain — berhasil! Keuntunganya banyak banget:\n🌐 Akses dari mana saja — tidak perlu lagi berada di jaringan yang sama 🔒 Aman — tidak perlu buka port di router, server tidak terekspos langsung ke internet 💰 Gratis — Cloudflare Zero Trust plan free sudah mencukupi 🏠 IP dynamic tidak masalah — tunnel bekerja secara outbound, jadi ganti-ganti IP pun tetap jalan ⚡ Mudah diingat — pakai domain, bukan IP address Konsepnya simpel: pasang Cloudflare Tunnel di server lokal, arahkan domain ke SSH, tambah ProxyCommand di client, dan selesai! Dampaknya besar banget buat produktivitas, terutama kalau kamu sering bekerja remote dan butuh akses ke server di rumah atau kantor.\n","permalink":"https://blog.bahrani.my.id/docs/catatan/ssh-local-domain/","summary":"\u003ch2 id=\"pernah-bingung-bagaimana-cara-akses-server-lokal-dari-jauh\"\u003ePernah Bingung Bagaimana Cara Akses Server Lokal dari Jauh?\u003c/h2\u003e\n\u003cp\u003eBayangkan kamu punya server lokal di rumah atau di kantor. Server itu jalan baik, tapi masalahnya — \u003cstrong\u003ekamu cuma bisa akses saat berada di jaringan yang sama\u003c/strong\u003e. Mau akses dari kafe, dari rumah teman, atau dari mana saja lewat internet? \u003cstrong\u003eTidak bisa.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSecara default, server lokal itu \u0026ldquo;tersembunyi\u0026rdquo; di balik jaringan lokal (LAN). Dia tidak punya alamat publik yang bisa dijangkau dari internet. Belum lagi kalau kamu pakai ISP rumahan yang ganti-ganti IP publik (dynamic IP), atau bahkan di-NAT sehingga kamu tidak bisa langsung port-forward.\u003c/p\u003e","title":"Server Local Bisa Di-SSH Lewat Domain"},{"content":"Apa itu Domain? Pernahkah kamu ingin mengunjungi sebuah website dan mengetikkan alamat seperti google.com atau tokopedia.com di browser? Nah, alamat inilah yang disebut domain.\nSecara sederhana, domain adalah alamat unik di internet yang digunakan untuk mempermudah kita mengakses sebuah situs web. Tanpa domain, kita harus mengetik IP address sekumpulan angka seperti 192.168.1.1 agar bisa membuka suatu website. Bayangkan kalau setiap kali mau buka YouTube kamu harus mengingat angka panjang seperti itu. Pasti repot, kan?\nDi sinilah domain berperan, karena sistem yang disebut DNS (Domain Name System) akan menerjemahkan nama domain menjadi alamat IP. Prinsip kerjanya mirip seperti mencari alamat rumah: kalau kamu ingin mengirim paket ke teman, kamu cukup tahu alamatnya tidak perlu tahu koordinat GPS-nya.\nJadi, bisa dibilang domain adalah “alamat rumah” bagi website di dunia digital. Ia ada agar kita, manusia, bisa mengingat dan menemukan situs web dengan mudah, tanpa perlu menghafal deretan angka yang membingungkan.\nBerkahost Awalnya saya juga tidak tahu ada penyedia layanan bernama Berkahost. Selama ini yang sering saya dengar justru nama-nama besar seperti DomaiNesia, Rumahweb, Niagahoster, IDwebhost, JagoanHosting, Dewaweb, atau IDCloudHost yang sudah lebih dulu populer di Indonesia. Setelah saya telusuri, ternyata Berkahost adalah layanan web hosting dan domain asal Serang, Banten, yang fokus menawarkan paket murah untuk pemula, termasuk domain dan hosting dengan harga terjangkau. berkahost\nYang membuat saya tertarik adalah adanya promo domain dengan harga yang sangat rendah, sehingga dengan modal beberapa ribu rupiah saja kamu sudah bisa punya alamat domain sendiri. Promo seperti ini biasanya dibatasi untuk ekstensi tertentu atau periode tertentu, tapi sudah lebih dari cukup kalau kamu hanya ingin:\nIseng bikin blog pribadi. Punya domain untuk main-main dengan homeserver di rumah. Menghubungkan domain ke GitHub Pages atau layanan static site lain. Mencoba-coba proyek kecil tanpa keluar biaya besar. Dengan memiliki domain sendiri, kamu bisa melakukan customisasi alamat sesuai keinginan, misalnya memakai nama brand pribadi, nama proyek, atau sekadar username favoritmu. Rasanya mirip seperti punya “nama jalan” sendiri di internet: lebih rapi, lebih mudah diingat, dan terlihat lebih serius, meskipun proyeknya masih sebatas eksperimen.\nSetelah Pembelian Setelah domainnya berhasil saya beli, pengelolaan DNS yang sebelumnya berada di Berkahost langsung saya pindahkan ke Cloudflare. Langkah ini saya ambil karena paket yang saya beli hanya berisi domain saja tanpa hosting dan tanpa sertifikat SSL bawaan, sehingga saya membutuhkan tempat pengelolaan DNS yang lebih fleksibel.\nSaya memilih Cloudflare karena sebagian besar domain saya juga sudah dikelola di sana, dan dashboard-nya menurut saya sangat nyaman untuk kustomisasi record DNS, pointing ke server lokal, hingga integrasi dengan berbagai layanan lain. Cloudflare sendiri menyediakan DNS yang cepat, mudah diatur, dan dapat digunakan meskipun hosting berada di tempat lain. Selain itu, pada plan gratis saja Cloudflare sudah memberikan fitur penting seperti SSL/TLS gratis, perlindungan dasar terhadap DDoS, serta CDN untuk mempercepat akses konten.\nBagi saya, Cloudflare menjadi semacam “pusat kontrol” untuk beberapa proyek pribadi: mulai dari blog sederhana, website statis, sampai server lokal yang saya expose dengan berbagai trik networking. Tingkat keamanannya sudah cukup nyaman untuk kebutuhan personal, apalagi dengan adanya fitur seperti DNSSEC, proteksi serangan berbasis DNS, dan pengelolaan aturan keamanan dasar di level jaringan. Untuk blog atau website pribadi, kombinasi domain murah dari Berkahost dan DNS plus keamanan gratis dari Cloudflare sudah lebih dari cukup untuk mulai membangun “rumah” kecil di internet tanpa keluar biaya besar\nSetelah Beli Domain: Lanjut Ngapain? Kadang sebagai pemula kita suka bingung: “Sudah beli domain, terus mau diapain?” Domain akhirnya cuma jadi pajangan, dibeli lalu dibiarkan selesai begitu saja. Padahal, dengan domain saja (tanpa hosting berbayar), sebenarnya sudah banyak hal yang bisa kita lakukan.\nSalah satu yang paling menyenangkan adalah deploy website statis: blog sederhana, cepat, murah, dan mudah dirawat. Website statis ini biasanya dibangun dari file markdown, lalu di-generate menjadi HTML oleh static site generator seperti Hugo atau Jekyll.\nMain Web Statis dengan Markdown Sebelumnya, blog saya ini saya hosting di GitHub, karena GitHub Pages memang sangat cocok untuk website statis: gratis, stabil, dan cukup untuk blog pribadi atau dokumentasi. Setelah saya baca-baca, ternyata ada banyak sekali tema kece untuk website statis yang bisa kita kostumisasi isinya hanya dengan file markdown, persis seperti yang sedang kamu baca sekarang. ​\nDi blog ini saya menggunakan Hugo dengan tema bernama PaperMod, sebuah tema Hugo yang cepat, bersih, dan sangat populer di komunitas Hugo. Struktur kontennya cukup tulis markdown di folder content, lalu Hugo akan mengubahnya menjadi file HTML siap deploy. Rasanya mirip menulis catatan di Notion, tapi outputnya jadi website beneran.\nUntuk percobaan lain pada domain yang baru saya beli, saya juga mencoba Jekyll dan menggunakan tema Minimal Mistakes, salah satu tema Jekyll yang sangat fleksibel untuk blog dan personal site. Kelebihannya, Jekyll terintegrasi dengan GitHub Pages sehingga kamu bisa langsung hosting dari repo GitHub tanpa perlu server sendiri.\nBelajar dan Eksperimen Tema Kabar baiknya, hampir semua tema populer punya dokumentasi dan tutorial lengkap di internet maupun YouTube: cara install, cara ganti warna, cara tambah menu, sampai optimasi SEO dasar. Tinggal pilih:\nMau pakai Hugo + PaperMod. Mau pakai Jekyll + Minimal Mistakes. Atau generator/tema lain yang sesuai selera. Setelah itu, alurnya kira-kira seperti ini:\nPilih generator (Hugo/Jekyll) Pilih tema yang kamu suka. Tulis konten dalam bentuk file markdown. Generate jadi website statis. Deploy ke GitHub Pages atau layanan serupa. Point domain yang sudah kamu beli ke hosting statis tersebut (misalnya lewat Cloudflare atau DNS provider lain). Pelan-pelan, domain yang tadinya “nganggur” bisa berubah jadi blog pribadi, dokumentasi, catatan teknis, atau apa pun yang kamu suka. Contohnya bisa kamu lihat di blog saya: TipsIT\nSummary Tantangan terbesar setelah punya blog atau domain sebenarnya bukan teknis, tapi bagaimana tetap konsisten menulis dan kembali pada tujuan awal: blog ini untuk apa. Banyak blogger menyarankan untuk selalu mengingat alasan pribadi saat mulai menulis, misalnya sebagai ruang ekspresi diri, dokumentasi perjalanan, atau sekadar catatan yang bisa diakses kapan saja selama ada internet.\nKalau tujuanmu memang untuk konsumsi pribadi, sebagai arsip catatan teknis atau jurnal kecil yang bisa kamu buka dari mana saja, itu sudah alasan yang sangat kuat untuk terus menulis. Banyak penulis menyarankan mulai dari langkah kecil: menulis sedikit demi sedikit, tidak perlu panjang atau sempurna, yang penting rutin dan terus berjalan. Tanpa memulai dan membiasakan diri, kebiasaan itu tidak akan pernah terbentuk, jadi satu paragraf pun sudah sebuah kemajuan.\n","permalink":"https://blog.bahrani.my.id/docs/catatan/domain/","summary":"\u003ch2 id=\"apa-itu-domain\"\u003eApa itu Domain?\u003c/h2\u003e\n\u003cp\u003ePernahkah kamu ingin mengunjungi sebuah website dan mengetikkan alamat seperti google.com atau tokopedia.com di browser? Nah, alamat inilah yang disebut domain.\u003c/p\u003e\n\u003cp\u003eSecara sederhana, domain adalah alamat unik di internet yang digunakan untuk mempermudah kita mengakses sebuah situs web. Tanpa domain, kita harus mengetik IP address sekumpulan angka seperti 192.168.1.1 agar bisa membuka suatu website. Bayangkan kalau setiap kali mau buka YouTube kamu harus mengingat angka panjang seperti itu. Pasti repot, kan?\u003c/p\u003e","title":"Promo Domain Berkahost"},{"content":"Showcase: Network Automation Dashboard Memperkenalkan dashboard web modern untuk otomasi jaringan. Aplikasi ini menyediakan antarmuka grafis yang user-friendly untuk mengelola, memonitor, dan mengotomatisasi perangkat jaringan Anda.\nBerikut adalah galeri fitur utama dari aplikasi ini.\n1. Manajemen Perangkat Dapatkan visibilitas penuh dan manajemen inventaris terpusat untuk seluruh infrastruktur jaringan Anda. Platform ini menyediakan single pane of glass untuk mengelola perangkat dari berbagai vendor, menyederhanakan proses onboarding dengan fitur impor massal, dan memastikan integritas data melalui validasi hostname secara real-time.\nTampilan daftar perangkat yang dikelola.\nFitur untuk memvalidasi hostname perangkat secara otomatis.\n2. Uji Konektivitas Proaktif dalam menjaga uptime layanan dengan fitur uji konektivitas terintegrasi. Validasi jangkauan perangkat melalui Ping dan kesiapan manajemen via SSH secara massal, memungkinkan identifikasi dan resolusi masalah konektivitas sebelum berdampak pada pengguna.\nHasil pengecekan konektivitas ke beberapa perangkat sekaligus.\n3. Assessment Dapatkan laporan mendalam mengenai kondisi perangkat, mulai dari versi software, model, hingga waktu aktif (uptime). Fitur ini membantu dalam audit dan pemeliharaan rutin.\nContoh hasil dari fitur Device Assessment.\n4. Backup dan Arsip Konfigurasi Amankan konfigurasi perangkat Anda dengan fitur pengambilan dan pengarsipan. Simpan riwayat konfigurasi sebagai golden-copy untuk pemulihan bencana atau analisis.\nFitur untuk mengambil dan menyimpan konfigurasi perangkat.\n5. Eksekusi Perintah Jarak Jauh (Command Runner) Akselerasi proses troubleshooting dan operasional harian dengan Remote Command Runner. Eksekusi perintah CLI secara aman ke perangkat mana pun langsung dari antarmuka web, mengurangi kebutuhan akses SSH manual dan memusatkan jejak audit.\nTampilan Command Runner untuk eksekusi perintah jarak jauh.\n6. Monitoring Perubahan Konfigurasi Tingkatkan keamanan dan kepatuhan (compliance) dengan memonitor setiap perubahan konfigurasi. Sistem secara otomatis membandingkan konfigurasi yang berjalan dengan baseline yang telah disetujui, memberikan notifikasi instan jika terdeteksi adanya modifikasi yang tidak sah atau tidak terjadwal.\nDashboard untuk memonitor setiap perubahan yang terjadi pada konfigurasi.\n","permalink":"https://blog.bahrani.my.id/docs/network-automation-platform/","summary":"\u003ch1 id=\"showcase-network-automation-dashboard\"\u003eShowcase: Network Automation Dashboard\u003c/h1\u003e\n\u003cp\u003eMemperkenalkan dashboard web modern untuk otomasi jaringan. Aplikasi ini menyediakan antarmuka grafis yang \u003cem\u003euser-friendly\u003c/em\u003e untuk mengelola, memonitor, dan mengotomatisasi perangkat jaringan Anda.\u003c/p\u003e\n\u003cp\u003eBerikut adalah galeri fitur utama dari aplikasi ini.\u003c/p\u003e\n\u003ch2 id=\"1-manajemen-perangkat\"\u003e1. Manajemen Perangkat\u003c/h2\u003e\n\u003cp\u003eDapatkan visibilitas penuh dan manajemen inventaris terpusat untuk seluruh infrastruktur jaringan Anda. Platform ini menyediakan \u003cem\u003esingle pane of glass\u003c/em\u003e untuk mengelola perangkat dari berbagai vendor, menyederhanakan proses onboarding dengan fitur impor massal, dan memastikan integritas data melalui validasi hostname secara \u003cem\u003ereal-time\u003c/em\u003e.\u003c/p\u003e","title":"Showcase: Network Automation Dashboard"},{"content":"Panduan Profesional: Kombinasi Rumus Lanjutan Excel \u0026amp; Google Sheets Dokumen ini menyajikan kumpulan teknik dan kombinasi rumus tingkat lanjut yang dirancang untuk meningkatkan efisiensi, fleksibilitas, dan profesionalisme dalam analisis data menggunakan spreadsheet. Setiap bagian menjelaskan skenario bisnis, struktur rumus, dan contoh praktis.\nBab 1: Teknik Pencarian (Lookup) Dinamis \u0026amp; Multi-Dimensi 1.1. Pencarian Dua Arah (Two-Way Lookup) Nama Kombinasi: INDEX + MATCH + MATCH Skenario Penggunaan: Ketika Anda perlu mengekstrak nilai dari sebuah tabel (matriks) di mana baik kriteria baris maupun kriteria kolom bersifat dinamis. Sangat berguna untuk dasbor atau laporan di mana pengguna bisa memilih parameter yang berbeda. Struktur Rumus: =INDEX(rentang_data_keseluruhan, MATCH(kriteria_baris, rentang_header_baris, 0), MATCH(kriteria_kolom, rentang_header_kolom, 0)) Penjelasan Komponen: INDEX(rentang_data_keseluruhan, ...): Menentukan area tabel utama tempat nilai akan diambil. MATCH(kriteria_baris, ...): Menemukan nomor baris yang cocok dengan kriteria. MATCH(kriteria_kolom, ...): Menemukan nomor kolom yang cocok dengan kriteria. Contoh Praktis: Misalkan Anda memiliki tabel penjualan produk per bulan. Produk ada di A2:A10, bulan ada di B1:G1, dan data penjualan ada di B2:G10. Pengguna memilih produk di sel I2 dan bulan di sel J2. =INDEX(B2:G10, MATCH(I2, A2:A10, 0), MATCH(J2, B1:G1, 0)) Keunggulan: Sangat dinamis dan kokoh. Jauh lebih superior daripada kombinasi VLOOKUP atau HLOOKUP yang rumit. 1.2. Pencarian Lintas Lembar Kerja (Cross-Sheet Lookup) Nama Kombinasi: INDIRECT + VLOOKUP Skenario Penggunaan: Ketika Anda perlu mengambil data dari lembar kerja (sheet) yang berbeda, di mana nama lembar kerja tersebut ditentukan oleh nilai dari sel lain. Berguna untuk mengkonsolidasikan data dari banyak sheet dengan struktur yang sama (misal, sheet \u0026ldquo;Januari\u0026rdquo;, \u0026ldquo;Februari\u0026rdquo;, dst.). Struktur Rumus: =VLOOKUP(nilai_dicari, INDIRECT(\u0026#34;\u0026#39;\u0026#34; \u0026amp; nama_sheet \u0026amp; \u0026#34;\u0026#39;!\u0026#34; \u0026amp; \u0026#34;rentang_tabel\u0026#34;), kolom_hasil, FALSE) Penjelasan Komponen: INDIRECT(...): Mengubah string teks menjadi referensi sel yang valid. \u0026quot;'\u0026quot; \u0026amp; nama_sheet \u0026amp; \u0026quot;'!\u0026quot; \u0026amp; \u0026quot;rentang_tabel\u0026quot;: Membuat string referensi, contoh: 'Januari'!A2:D100. Tanda kutip tunggal diperlukan jika nama sheet mengandung spasi. Contoh Praktis: Nama sheet (misal, \u0026ldquo;Januari\u0026rdquo;) ada di sel A1. Anda ingin mencari B1 dalam tabel A2:D100 di sheet tersebut. =VLOOKUP(B1, INDIRECT(\u0026#34;\u0026#39;\u0026#34; \u0026amp; A1 \u0026amp; \u0026#34;\u0026#39;!A2:D100\u0026#34;), 2, FALSE) Perhatian: INDIRECT adalah fungsi volatile, yang berarti akan dihitung ulang setiap kali ada perubahan di workbook, yang dapat memperlambat kinerja jika digunakan secara berlebihan. Bab 2: Agregasi \u0026amp; Analisis Data Bersyarat Tingkat Lanjut 2.1. Filter Dinamis dengan Logika AND/OR Nama Kombinasi: FILTER dengan operator * (AND) dan + (OR) Skenario Penggunaan: (Excel 365/Google Sheets) Menyaring sebuah dataset berdasarkan beberapa kriteria yang kompleks, menggabungkan kondisi AND dan OR dalam satu formula. Struktur Rumus: Logika AND: FILTER(rentang, (kriteria_rentang1 = kriteria1) * (kriteria_rentang2 = kriteria2)) Logika OR: FILTER(rentang, (kriteria_rentang1 = kriteria1) + (kriteria_rentang2 = kriteria2)) Penjelasan Komponen: Dalam konteks FILTER, * (perkalian) bekerja sebagai AND (TRUE*TRUE=1, lainnya 0). + (penjumlahan) bekerja sebagai OR (setidaknya satu TRUE akan menghasilkan nilai \u0026gt; 0). Contoh Praktis: Menampilkan data dari A2:C100 yang memenuhi kondisi: Region (kolom A) adalah \u0026ldquo;Utara\u0026rdquo; DAN (Status (kolom B) adalah \u0026ldquo;Selesai\u0026rdquo; ATAU Sales (kolom C) \u0026gt; 500). =FILTER(A2:C100, (A2:A100=\u0026#34;Utara\u0026#34;) * ((B2:B100=\u0026#34;Selesai\u0026#34;) + (C2:C100\u0026gt;500))) 2.2. Ekstraksi Data Aman dari PivotTable Nama Fungsi: GETPIVOTDATA Skenario Penggunaan: Mengambil nilai ringkasan dari PivotTable secara terprogram. Berbeda dengan referensi sel langsung (misal, =C5), GETPIVOTDATA tidak akan rusak meskipun tata letak PivotTable diubah (misal, field dipindahkan atau item difilter). Ini adalah praktik terbaik untuk membuat laporan dasbor yang terhubung ke PivotTable. Struktur Rumus: =GETPIVOTDATA(\u0026#34;Nama_Field_Data\u0026#34;, lokasi_pivot_table, \u0026#34;Field1\u0026#34;, \u0026#34;Item1\u0026#34;, \u0026#34;Field2\u0026#34;, \u0026#34;Item2\u0026#34;, ...) Contoh Praktis: Mengambil total \u0026ldquo;Jumlah Penjualan\u0026rdquo; untuk \u0026ldquo;Produk A\u0026rdquo; di \u0026ldquo;Region Timur\u0026rdquo; dari PivotTable yang dimulai di sel A3. =GETPIVOTDATA(\u0026#34;Jumlah Penjualan\u0026#34;, $A$3, \u0026#34;Produk\u0026#34;, \u0026#34;Produk A\u0026#34;, \u0026#34;Region\u0026#34;, \u0026#34;Timur\u0026#34;) Tips: Cara termudah untuk membuat rumus ini adalah dengan mengetik = di sel mana pun, lalu klik pada nilai di dalam PivotTable yang Anda inginkan. Excel akan secara otomatis menghasilkan formula GETPIVOTDATA untuk Anda. Bab 3: Teknik Visualisasi \u0026amp; Pelaporan Profesional 3.1. Grafik Dalam Sel (In-Cell Charting) Nama Kombinasi: REPT Skenario Penggunaan: Membuat visualisasi data sederhana (seperti bar chart) langsung di dalam sel, tanpa menggunakan objek grafik Excel. Sangat baik untuk tabel dasbor yang ringkas. Struktur Rumus: =REPT(\u0026#34;karakter_untuk_diulang\u0026#34;, jumlah_pengulangan) Contoh Praktis: Jika nilai penjualan ada di A2 (misal, 85), buat bar chart horizontal. =REPT(\u0026#34;|\u0026#34;, A2/10) Ini akan menampilkan |||||||||. Anda bisa mengubah 10 untuk skala. Gunakan font seperti \u0026ldquo;Playbill\u0026rdquo; atau \u0026ldquo;Stencilla\u0026rdquo; untuk membuat bar terlihat menyatu. Keunggulan: Ringan, terintegrasi dengan tabel, dan dinamis. 3.2. Judul Laporan Dinamis Nama Kombinasi: TEXT + TODAY() Skenario Penggunaan: Membuat judul atau subjudul laporan yang secara otomatis diperbarui dengan tanggal atau periode saat ini, memberikan sentuhan profesional dan memastikan informasi selalu relevan. Struktur Rumus: =\u0026#34;Teks Statis \u0026#34; \u0026amp; TEXT(nilai_tanggal, \u0026#34;format_teks\u0026#34;) Contoh Praktis: Membuat judul \u0026ldquo;Laporan Penjualan Bulanan per 26 Oktober 2025\u0026rdquo;. =\u0026#34;Laporan Penjualan Bulanan per \u0026#34; \u0026amp; TEXT(TODAY(), \u0026#34;d MMMM yyyy\u0026#34;) Variasi: Anda bisa menggunakan EOMONTH(TODAY(), -1) untuk menampilkan tanggal akhir bulan sebelumnya, berguna untuk laporan bulanan. Kombinasi Rumus Excel \u0026amp; Google Sheets yang Sering Digunakan Berikut adalah beberapa kombinasi rumus yang sangat kuat dan sering digunakan untuk menyelesaikan masalah yang lebih kompleks di Excel dan Google Sheets.\n1. INDEX + MATCH (Alternatif VLOOKUP yang Unggul) Kombinasi ini adalah cara paling fleksibel dan aman untuk melakukan pencarian data, mengatasi banyak kelemahan VLOOKUP.\nKelebihan:\nKolom hasil bisa berada di sebelah kiri kolom pencarian. Tidak mudah rusak jika ada penambahan atau penghapusan kolom. Lebih efisien pada dataset besar. Struktur:\n=INDEX(kolom_yang_ingin_diambil_hasilnya, MATCH(nilai_yang_dicari, kolom_pencarian, 0)) MATCH menemukan posisi (nomor baris) dari nilai_yang_dicari. INDEX mengambil nilai dari kolom_hasil pada posisi (nomor baris) tersebut. Contoh: Mencari Jabatan (di kolom A) berdasarkan Nama (di kolom B).\n=INDEX(A2:A100, MATCH(\u0026#34;John Doe\u0026#34;, B2:B100, 0)) 2. IFERROR (Menangani Error dengan Elegan) Gunakan IFERROR untuk menampilkan pesan atau nilai kustom ketika sebuah rumus menghasilkan error (misalnya #N/A, #DIV/0!, #VALUE!).\nStruktur:\n=IFERROR(rumus_utama, nilai_jika_error) Contoh: Jika VLOOKUP tidak menemukan hasil, tampilkan \u0026ldquo;Data Tidak Ditemukan\u0026rdquo; daripada #N/A.\n=IFERROR(VLOOKUP(A1, D:E, 2, FALSE), \u0026#34;Data Tidak Ditemukan\u0026#34;) 3. VLOOKUP + MATCH (VLOOKUP dengan Kolom Dinamis) Membuat argumen col_index_num pada VLOOKUP menjadi dinamis, sehingga tidak perlu mengubah rumus saat urutan kolom berubah.\nStruktur:\n=VLOOKUP(nilai_dicari, rentang_tabel, MATCH(nama_kolom_hasil, rentang_header_tabel, 0), FALSE) MATCH akan mencari posisi kolom berdasarkan namanya di baris header. Contoh: Mencari data penjualan dari bulan yang dipilih di sel B1. Header tabel (Jan, Feb, Mar, \u0026hellip;) ada di C1:E1.\n=VLOOKUP(A2, C2:E100, MATCH(B1, C1:E1, 0), FALSE) 4. SUMPRODUCT (Menjumlahkan dengan Multi-Kriteria) SUMPRODUCT adalah rumus serbaguna yang bisa menjumlahkan atau menghitung berdasarkan beberapa kriteria tanpa perlu formula array (Ctrl+Shift+Enter).\nStruktur untuk Menjumlahkan:\n=SUMPRODUCT((kriteria_rentang1 = kriteria1) * (kriteria_rentang2 = kriteria2) * rentang_yang_dijumlahkan) Catatan: Tanda * berfungsi sebagai operator AND.\nContoh: Menjumlahkan Total Penjualan (kolom C) untuk produk \u0026ldquo;Apel\u0026rdquo; (kolom A) di wilayah \u0026ldquo;Barat\u0026rdquo; (kolom B).\n=SUMPRODUCT((A2:A100=\u0026#34;Apel\u0026#34;) * (B2:B100=\u0026#34;Barat\u0026#34;) * C2:C100) 5. OFFSET + COUNTA (Membuat Rentang Dinamis) Kombinasi ini sering digunakan dalam Named Ranges atau validasi data untuk membuat rentang yang otomatis meluas saat data baru ditambahkan.\nStruktur:\n=OFFSET(sel_awal, 0, 0, COUNTA(kolom_data), 1) COUNTA menghitung semua sel yang tidak kosong di sebuah kolom untuk menentukan tinggi rentang. OFFSET membuat referensi rentang dengan tinggi tersebut. Contoh: Membuat rentang dinamis untuk data di kolom A yang dimulai dari A1.\n=OFFSET($A$1, 0, 0, COUNTA($A:$A), 1) Rumus ini biasanya dimasukkan ke dalam Name Manager (Formulas \u0026gt; Name Manager) untuk memberi nama pada rentang dinamis tersebut.\n6. Kombinasi Fungsi Teks (Membersihkan dan Menggabungkan Data) Sangat umum digunakan untuk membersihkan data yang diimpor dari sistem lain.\nContoh 1: Membersihkan Nama Menggabungkan nama depan (A2) dan nama belakang (B2), lalu memformatnya menjadi Proper Case dan menghapus spasi berlebih.\n=TRIM(PROPER(A2 \u0026amp; \u0026#34; \u0026#34; \u0026amp; B2)) Contoh 2: Mengekstrak Kode dari String Mengambil kode produk yang berada setelah tanda - dari string seperti \u0026ldquo;PROD-XYZ123\u0026rdquo; di sel A2.\n=RIGHT(A2, LEN(A2) - FIND(\u0026#34;-\u0026#34;, A2)) 7. Chaining Fungsi Array Dinamis (Excel 365 / Google Sheets) Fungsi array dinamis bisa digabungkan (chaining) untuk melakukan beberapa transformasi data dalam satu rumus.\nStruktur: Fungsi luar membungkus fungsi dalam. SORT(UNIQUE(FILTER(...)))\nContoh: Dapatkan daftar nama pelanggan unik (kolom B) dari kota \u0026ldquo;Surabaya\u0026rdquo; (kolom D), lalu urutkan hasilnya dari A-Z.\n=SORT(UNIQUE(FILTER(B2:B100, D2:D100=\u0026#34;Surabaya\u0026#34;, \u0026#34;Tidak Ada Data\u0026#34;))) FILTER mengambil semua nama dari Surabaya. UNIQUE menghilangkan nama yang duplikat. SORT mengurutkan hasilnya. ","permalink":"https://blog.bahrani.my.id/docs/pribadi/panduan_profesional_rumus_excel/","summary":"\u003ch1 id=\"panduan-profesional-kombinasi-rumus-lanjutan-excel--google-sheets\"\u003ePanduan Profesional: Kombinasi Rumus Lanjutan Excel \u0026amp; Google Sheets\u003c/h1\u003e\n\u003cp\u003eDokumen ini menyajikan kumpulan teknik dan kombinasi rumus tingkat lanjut yang dirancang untuk meningkatkan efisiensi, fleksibilitas, dan profesionalisme dalam analisis data menggunakan spreadsheet. Setiap bagian menjelaskan skenario bisnis, struktur rumus, dan contoh praktis.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"bab-1-teknik-pencarian-lookup-dinamis--multi-dimensi\"\u003eBab 1: Teknik Pencarian (Lookup) Dinamis \u0026amp; Multi-Dimensi\u003c/h2\u003e\n\u003ch3 id=\"11-pencarian-dua-arah-two-way-lookup\"\u003e1.1. Pencarian Dua Arah (Two-Way Lookup)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNama Kombinasi:\u003c/strong\u003e \u003ccode\u003eINDEX\u003c/code\u003e + \u003ccode\u003eMATCH\u003c/code\u003e + \u003ccode\u003eMATCH\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkenario Penggunaan:\u003c/strong\u003e Ketika Anda perlu mengekstrak nilai dari sebuah tabel (matriks) di mana baik kriteria baris maupun kriteria kolom bersifat dinamis. Sangat berguna untuk dasbor atau laporan di mana pengguna bisa memilih parameter yang berbeda.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStruktur Rumus:\u003c/strong\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=INDEX(rentang_data_keseluruhan, MATCH(kriteria_baris, rentang_header_baris, 0), MATCH(kriteria_kolom, rentang_header_kolom, 0))\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePenjelasan Komponen:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eINDEX(rentang_data_keseluruhan, ...)\u003c/code\u003e: Menentukan area tabel utama tempat nilai akan diambil.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMATCH(kriteria_baris, ...)\u003c/code\u003e: Menemukan nomor baris yang cocok dengan kriteria.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMATCH(kriteria_kolom, ...)\u003c/code\u003e: Menemukan nomor kolom yang cocok dengan kriteria.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContoh Praktis:\u003c/strong\u003e\nMisalkan Anda memiliki tabel penjualan produk per bulan. Produk ada di \u003ccode\u003eA2:A10\u003c/code\u003e, bulan ada di \u003ccode\u003eB1:G1\u003c/code\u003e, dan data penjualan ada di \u003ccode\u003eB2:G10\u003c/code\u003e. Pengguna memilih produk di sel \u003ccode\u003eI2\u003c/code\u003e dan bulan di sel \u003ccode\u003eJ2\u003c/code\u003e.\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=INDEX(B2:G10, MATCH(I2, A2:A10, 0), MATCH(J2, B1:G1, 0))\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKeunggulan:\u003c/strong\u003e Sangat dinamis dan kokoh. Jauh lebih superior daripada kombinasi \u003ccode\u003eVLOOKUP\u003c/code\u003e atau \u003ccode\u003eHLOOKUP\u003c/code\u003e yang rumit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"12-pencarian-lintas-lembar-kerja-cross-sheet-lookup\"\u003e1.2. Pencarian Lintas Lembar Kerja (Cross-Sheet Lookup)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNama Kombinasi:\u003c/strong\u003e \u003ccode\u003eINDIRECT\u003c/code\u003e + \u003ccode\u003eVLOOKUP\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkenario Penggunaan:\u003c/strong\u003e Ketika Anda perlu mengambil data dari lembar kerja (sheet) yang berbeda, di mana nama lembar kerja tersebut ditentukan oleh nilai dari sel lain. Berguna untuk mengkonsolidasikan data dari banyak sheet dengan struktur yang sama (misal, sheet \u0026ldquo;Januari\u0026rdquo;, \u0026ldquo;Februari\u0026rdquo;, dst.).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStruktur Rumus:\u003c/strong\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=VLOOKUP(nilai_dicari, INDIRECT(\u0026#34;\u0026#39;\u0026#34; \u0026amp; nama_sheet \u0026amp; \u0026#34;\u0026#39;!\u0026#34; \u0026amp; \u0026#34;rentang_tabel\u0026#34;), kolom_hasil, FALSE)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePenjelasan Komponen:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eINDIRECT(...)\u003c/code\u003e: Mengubah string teks menjadi referensi sel yang valid.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026quot;'\u0026quot; \u0026amp; nama_sheet \u0026amp; \u0026quot;'!\u0026quot; \u0026amp; \u0026quot;rentang_tabel\u0026quot;\u003c/code\u003e: Membuat string referensi, contoh: \u003ccode\u003e'Januari'!A2:D100\u003c/code\u003e. Tanda kutip tunggal diperlukan jika nama sheet mengandung spasi.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContoh Praktis:\u003c/strong\u003e\nNama sheet (misal, \u0026ldquo;Januari\u0026rdquo;) ada di sel \u003ccode\u003eA1\u003c/code\u003e. Anda ingin mencari \u003ccode\u003eB1\u003c/code\u003e dalam tabel \u003ccode\u003eA2:D100\u003c/code\u003e di sheet tersebut.\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=VLOOKUP(B1, INDIRECT(\u0026#34;\u0026#39;\u0026#34; \u0026amp; A1 \u0026amp; \u0026#34;\u0026#39;!A2:D100\u0026#34;), 2, FALSE)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePerhatian:\u003c/strong\u003e \u003ccode\u003eINDIRECT\u003c/code\u003e adalah fungsi \u003cem\u003evolatile\u003c/em\u003e, yang berarti akan dihitung ulang setiap kali ada perubahan di workbook, yang dapat memperlambat kinerja jika digunakan secara berlebihan.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"bab-2-agregasi--analisis-data-bersyarat-tingkat-lanjut\"\u003eBab 2: Agregasi \u0026amp; Analisis Data Bersyarat Tingkat Lanjut\u003c/h2\u003e\n\u003ch3 id=\"21-filter-dinamis-dengan-logika-andor\"\u003e2.1. Filter Dinamis dengan Logika AND/OR\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNama Kombinasi:\u003c/strong\u003e \u003ccode\u003eFILTER\u003c/code\u003e dengan operator \u003ccode\u003e*\u003c/code\u003e (AND) dan \u003ccode\u003e+\u003c/code\u003e (OR)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkenario Penggunaan:\u003c/strong\u003e (Excel 365/Google Sheets) Menyaring sebuah dataset berdasarkan beberapa kriteria yang kompleks, menggabungkan kondisi AND dan OR dalam satu formula.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStruktur Rumus:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eLogika AND:\u003c/strong\u003e \u003ccode\u003eFILTER(rentang, (kriteria_rentang1 = kriteria1) * (kriteria_rentang2 = kriteria2))\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLogika OR:\u003c/strong\u003e \u003ccode\u003eFILTER(rentang, (kriteria_rentang1 = kriteria1) + (kriteria_rentang2 = kriteria2))\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePenjelasan Komponen:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003eDalam konteks \u003ccode\u003eFILTER\u003c/code\u003e, \u003ccode\u003e*\u003c/code\u003e (perkalian) bekerja sebagai \u003ccode\u003eAND\u003c/code\u003e (TRUE*TRUE=1, lainnya 0).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e+\u003c/code\u003e (penjumlahan) bekerja sebagai \u003ccode\u003eOR\u003c/code\u003e (setidaknya satu TRUE akan menghasilkan nilai \u0026gt; 0).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContoh Praktis:\u003c/strong\u003e\nMenampilkan data dari \u003ccode\u003eA2:C100\u003c/code\u003e yang memenuhi kondisi: \u003cstrong\u003eRegion\u003c/strong\u003e (kolom A) adalah \u0026ldquo;Utara\u0026rdquo; \u003cstrong\u003eDAN\u003c/strong\u003e (\u003cstrong\u003eStatus\u003c/strong\u003e (kolom B) adalah \u0026ldquo;Selesai\u0026rdquo; \u003cstrong\u003eATAU\u003c/strong\u003e \u003cstrong\u003eSales\u003c/strong\u003e (kolom C) \u0026gt; 500).\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=FILTER(A2:C100, (A2:A100=\u0026#34;Utara\u0026#34;) * ((B2:B100=\u0026#34;Selesai\u0026#34;) + (C2:C100\u0026gt;500)))\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"22-ekstraksi-data-aman-dari-pivottable\"\u003e2.2. Ekstraksi Data Aman dari PivotTable\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNama Fungsi:\u003c/strong\u003e \u003ccode\u003eGETPIVOTDATA\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkenario Penggunaan:\u003c/strong\u003e Mengambil nilai ringkasan dari PivotTable secara terprogram. Berbeda dengan referensi sel langsung (misal, \u003ccode\u003e=C5\u003c/code\u003e), \u003ccode\u003eGETPIVOTDATA\u003c/code\u003e tidak akan rusak meskipun tata letak PivotTable diubah (misal, field dipindahkan atau item difilter). Ini adalah praktik terbaik untuk membuat laporan dasbor yang terhubung ke PivotTable.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStruktur Rumus:\u003c/strong\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=GETPIVOTDATA(\u0026#34;Nama_Field_Data\u0026#34;, lokasi_pivot_table, \u0026#34;Field1\u0026#34;, \u0026#34;Item1\u0026#34;, \u0026#34;Field2\u0026#34;, \u0026#34;Item2\u0026#34;, ...)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContoh Praktis:\u003c/strong\u003e\nMengambil total \u0026ldquo;Jumlah Penjualan\u0026rdquo; untuk \u0026ldquo;Produk A\u0026rdquo; di \u0026ldquo;Region Timur\u0026rdquo; dari PivotTable yang dimulai di sel \u003ccode\u003eA3\u003c/code\u003e.\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=GETPIVOTDATA(\u0026#34;Jumlah Penjualan\u0026#34;, $A$3, \u0026#34;Produk\u0026#34;, \u0026#34;Produk A\u0026#34;, \u0026#34;Region\u0026#34;, \u0026#34;Timur\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTips:\u003c/strong\u003e Cara termudah untuk membuat rumus ini adalah dengan mengetik \u003ccode\u003e=\u003c/code\u003e di sel mana pun, lalu klik pada nilai di dalam PivotTable yang Anda inginkan. Excel akan secara otomatis menghasilkan formula \u003ccode\u003eGETPIVOTDATA\u003c/code\u003e untuk Anda.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"bab-3-teknik-visualisasi--pelaporan-profesional\"\u003eBab 3: Teknik Visualisasi \u0026amp; Pelaporan Profesional\u003c/h2\u003e\n\u003ch3 id=\"31-grafik-dalam-sel-in-cell-charting\"\u003e3.1. Grafik Dalam Sel (In-Cell Charting)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNama Kombinasi:\u003c/strong\u003e \u003ccode\u003eREPT\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkenario Penggunaan:\u003c/strong\u003e Membuat visualisasi data sederhana (seperti bar chart) langsung di dalam sel, tanpa menggunakan objek grafik Excel. Sangat baik untuk tabel dasbor yang ringkas.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStruktur Rumus:\u003c/strong\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=REPT(\u0026#34;karakter_untuk_diulang\u0026#34;, jumlah_pengulangan)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContoh Praktis:\u003c/strong\u003e\nJika nilai penjualan ada di \u003ccode\u003eA2\u003c/code\u003e (misal, 85), buat bar chart horizontal.\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=REPT(\u0026#34;|\u0026#34;, A2/10) \n\u003c/code\u003e\u003c/pre\u003eIni akan menampilkan \u003ccode\u003e|||||||||\u003c/code\u003e. Anda bisa mengubah \u003ccode\u003e10\u003c/code\u003e untuk skala. Gunakan font seperti \u0026ldquo;Playbill\u0026rdquo; atau \u0026ldquo;Stencilla\u0026rdquo; untuk membuat bar terlihat menyatu.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKeunggulan:\u003c/strong\u003e Ringan, terintegrasi dengan tabel, dan dinamis.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"32-judul-laporan-dinamis\"\u003e3.2. Judul Laporan Dinamis\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNama Kombinasi:\u003c/strong\u003e \u003ccode\u003eTEXT\u003c/code\u003e + \u003ccode\u003eTODAY()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkenario Penggunaan:\u003c/strong\u003e Membuat judul atau subjudul laporan yang secara otomatis diperbarui dengan tanggal atau periode saat ini, memberikan sentuhan profesional dan memastikan informasi selalu relevan.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStruktur Rumus:\u003c/strong\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=\u0026#34;Teks Statis \u0026#34; \u0026amp; TEXT(nilai_tanggal, \u0026#34;format_teks\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContoh Praktis:\u003c/strong\u003e\nMembuat judul \u0026ldquo;Laporan Penjualan Bulanan per 26 Oktober 2025\u0026rdquo;.\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-excel\" data-lang=\"excel\"\u003e=\u0026#34;Laporan Penjualan Bulanan per \u0026#34; \u0026amp; TEXT(TODAY(), \u0026#34;d MMMM yyyy\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVariasi:\u003c/strong\u003e Anda bisa menggunakan \u003ccode\u003eEOMONTH(TODAY(), -1)\u003c/code\u003e untuk menampilkan tanggal akhir bulan sebelumnya, berguna untuk laporan bulanan.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"kombinasi-rumus-excel--google-sheets-yang-sering-digunakan\"\u003eKombinasi Rumus Excel \u0026amp; Google Sheets yang Sering Digunakan\u003c/h1\u003e\n\u003cp\u003eBerikut adalah beberapa kombinasi rumus yang sangat kuat dan sering digunakan untuk menyelesaikan masalah yang lebih kompleks di Excel dan Google Sheets.\u003c/p\u003e","title":"Rumus Excel"},{"content":"Git Cheatsheet untuk GitHub \u0026amp; GitLab Dokumen ini berisi kumpulan perintah Git yang paling sering digunakan, dari konfigurasi awal hingga sinkronisasi dengan remote repository di GitHub atau GitLab.\n1. Konfigurasi Awal (Hanya perlu dilakukan sekali) Perintah ini untuk mengatur identitas Anda pada Git di mesin lokal.\n# Mengatur nama pengguna Anda git config --global user.name \u0026#34;Nama Anda\u0026#34; # Mengatur email pengguna Anda (gunakan email yang terdaftar di GitHub/GitLab) git config --global user.email \u0026#34;email@anda.com\u0026#34; 2. Membuat atau Mengambil Proyek # Inisialisasi repository baru di folder yang sudah ada git init # Clone (mengunduh) repository yang sudah ada di GitHub/GitLab git clone [URL_REPOSITORY] URL_REPOSITORY: Ganti dengan URL SSH atau HTTPS dari repository Anda. Contoh GitHub: https://github.com/username/nama-repo.git Contoh GitLab: https://gitlab.com/username/nama-repo.git 3. Sinkronisasi dengan Remote Repository Ini adalah bagian terpenting untuk berkolaborasi dan menjaga kode Anda tetap up-to-date.\n# Menambahkan remote repository (biasanya bernama \u0026#39;origin\u0026#39;) # Ini yang ada di catatan Anda. git remote add origin [URL_REPOSITORY] # Melihat daftar remote repository yang sudah terhubung git remote -v # Mengambil perubahan terbaru dari remote tanpa menggabungkannya (aman) git fetch origin # Menarik (pull) perubahan dari branch \u0026#39;main\u0026#39; di remote \u0026#39;origin\u0026#39; # Opsi 1: Menggunakan merge (default, membuat commit merge) git pull origin main # Opsi 2: Menggunakan rebase (seperti di catatan Anda, membuat histori lebih bersih) # Ini akan menempatkan perubahan lokal Anda di atas perubahan dari remote. git pull origin main --rebase # Mendorong (push) perubahan dari branch lokal ke remote # Perintah ini mendorong branch \u0026#39;main\u0026#39; dan mengaturnya agar terhubung (-u) git push -u origin main # Push biasa setelah koneksi diatur git push origin main # Mendorong (push) secara paksa. HATI-HATI! # Ini akan menimpa histori di remote. Hanya gunakan jika Anda tahu apa yang Anda lakukan. # \u0026#39;-f\u0026#39; adalah singkatan dari \u0026#39;--force\u0026#39;. git push -f origin main 4. Bekerja dengan Perubahan (Workflow Harian) # Melihat status perubahan di working directory git status # Menambahkan satu file ke staging area (area persiapan sebelum commit) git add [NAMA_FILE] # Menambahkan semua perubahan di direktori saat ini ke staging area git add . # Menyimpan perubahan yang ada di staging area ke dalam sebuah \u0026#39;commit\u0026#39; git commit -m \u0026#34;Pesan commit yang deskriptif\u0026#34; 5. Bekerja dengan Branch Branch memungkinkan Anda untuk bekerja pada fitur baru atau perbaikan bug secara terisolasi.\n# Melihat semua branch yang ada (lokal dan remote) git branch -a # Membuat branch baru git branch [NAMA_BRANCH_BARU] # Pindah ke branch lain git checkout [NAMA_BRANCH] # Membuat dan langsung pindah ke branch baru (shortcut) git checkout -b [NAMA_BRANCH_BARU] # Mengganti nama branch saat ini (seperti di catatan Anda) # \u0026#39;-M\u0026#39; akan mengganti nama secara paksa, bagus untuk branch \u0026#39;master\u0026#39; ke \u0026#39;main\u0026#39;. git branch -M main # Menggabungkan perubahan dari branch lain ke branch saat ini git merge [NAMA_BRANCH_YANG_AKAN_DIGABUNG] # Menghapus branch lokal (setelah digabungkan) git branch -d [NAMA_BRANCH] 6. Melihat Riwayat \u0026amp; Mengurungkan Perubahan # Melihat riwayat commit git log # Melihat riwayat commit dalam format yang lebih ringkas git log --oneline --graph # Mengurungkan perubahan pada file di working directory (sebelum di-commit) git checkout -- [NAMA_FILE] # Membuat commit baru yang merupakan kebalikan dari commit sebelumnya (aman) git revert HEAD # Reset ke commit tertentu dan menghapus semua perubahan setelahnya (berbahaya) # Gunakan dengan hati-hati, terutama pada branch yang sudah di-push. git reset --hard [HASH_COMMIT] ","permalink":"https://blog.bahrani.my.id/docs/catatan/github/","summary":"\u003ch3 id=\"git-cheatsheet-untuk-github--gitlab\"\u003e\u003cstrong\u003eGit Cheatsheet untuk GitHub \u0026amp; GitLab\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003eDokumen ini berisi kumpulan perintah Git yang paling sering digunakan, dari konfigurasi awal hingga sinkronisasi dengan remote repository di GitHub atau GitLab.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"1-konfigurasi-awal-hanya-perlu-dilakukan-sekali\"\u003e\u003cstrong\u003e1. Konfigurasi Awal (Hanya perlu dilakukan sekali)\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003ePerintah ini untuk mengatur identitas Anda pada Git di mesin lokal.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Mengatur nama pengguna Anda\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global user.name \u003cspan class=\"s2\"\u003e\u0026#34;Nama Anda\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Mengatur email pengguna Anda (gunakan email yang terdaftar di GitHub/GitLab)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global user.email \u003cspan class=\"s2\"\u003e\u0026#34;email@anda.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"2-membuat-atau-mengambil-proyek\"\u003e\u003cstrong\u003e2. Membuat atau Mengambil Proyek\u003c/strong\u003e\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Inisialisasi repository baru di folder yang sudah ada\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clone (mengunduh) repository yang sudah ada di GitHub/GitLab\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone \u003cspan class=\"o\"\u003e[\u003c/span\u003eURL_REPOSITORY\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eURL_REPOSITORY\u003c/strong\u003e: Ganti dengan URL SSH atau HTTPS dari repository Anda.\n\u003cul\u003e\n\u003cli\u003eContoh GitHub: \u003ccode\u003ehttps://github.com/username/nama-repo.git\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eContoh GitLab: \u003ccode\u003ehttps://gitlab.com/username/nama-repo.git\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"3-sinkronisasi-dengan-remote-repository\"\u003e\u003cstrong\u003e3. Sinkronisasi dengan Remote Repository\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003eIni adalah bagian terpenting untuk berkolaborasi dan menjaga kode Anda tetap up-to-date.\u003c/p\u003e","title":"GIT CHEAT SHEET"},{"content":"Aplikasi web sederhana untuk memvisualisasikan topologi jaringan berdasarkan data dari Cisco Discovery Protocol (CDP) yang diekspor ke dalam format file Excel.\nDeskripsi Aplikasi ini menggunakan library Streamlit di Python untuk membuat aplikasi web interaktif. Ia akan membaca file .xlsx yang berisi data CDP (seperti nama perangkat, alamat IP, port yang terhubung, dll.), kemudian menggunakan library networkx dan matplotlib untuk membuat dan menampilkan gambar topologi jaringan.\nFitur Membaca data perangkat jaringan dari file Excel. Membangun model graf dari topologi jaringan. Menampilkan visualisasi topologi jaringan melalui antarmuka web interaktif. Menggunakan ikon SVG untuk merepresentasikan tipe perangkat yang berbeda (router, switch, dll). Struktur Proyek . ├── app.py # Logika utama aplikasi Streamlit ├── data/ │ └── cdp_neighbors.xlsx # Contoh file data CDP └── img/ # Ikon untuk perangkat jaringan Instalasi \u0026amp; Penggunaan Instalasi library yang dibutuhkan:\npip install streamlit pandas networkx matplotlib openpyxl Jalankan aplikasi:\nstreamlit run app.py Buka browser web Anda dan kunjungi alamat yang muncul di terminal (biasanya http://localhost:8501).\nAnda akan melihat visualisasi topologi jaringan yang dihasilkan dari data Anda.\nContoh Hasil Berikut adalah contoh visualisasi yang dihasilkan oleh aplikasi:\nKontribusi Kontribusi dalam bentuk pull request sangat diterima. Untuk perubahan besar, silakan buka issue terlebih dahulu untuk mendiskusikan apa yang ingin Anda ubah.\n","permalink":"https://blog.bahrani.my.id/docs/catatan/proyek-visualisasi-jaringan-cdp/","summary":"\u003cp\u003eAplikasi web sederhana untuk memvisualisasikan topologi jaringan berdasarkan data dari Cisco Discovery Protocol (CDP) yang diekspor ke dalam format file Excel.\u003c/p\u003e\n\u003ch2 id=\"deskripsi\"\u003eDeskripsi\u003c/h2\u003e\n\u003cp\u003eAplikasi ini menggunakan library \u003cstrong\u003eStreamlit\u003c/strong\u003e di Python untuk membuat aplikasi web interaktif. Ia akan membaca file \u003ccode\u003e.xlsx\u003c/code\u003e yang berisi data CDP (seperti nama perangkat, alamat IP, port yang terhubung, dll.), kemudian menggunakan library \u003ccode\u003enetworkx\u003c/code\u003e dan \u003ccode\u003ematplotlib\u003c/code\u003e untuk membuat dan menampilkan gambar topologi jaringan.\u003c/p\u003e\n\u003ch2 id=\"fitur\"\u003eFitur\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMembaca data perangkat jaringan dari file Excel.\u003c/li\u003e\n\u003cli\u003eMembangun model graf dari topologi jaringan.\u003c/li\u003e\n\u003cli\u003eMenampilkan visualisasi topologi jaringan melalui antarmuka web interaktif.\u003c/li\u003e\n\u003cli\u003eMenggunakan ikon SVG untuk merepresentasikan tipe perangkat yang berbeda (router, switch, dll).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"struktur-proyek\"\u003eStruktur Proyek\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e.\n├── app.py                # Logika utama aplikasi Streamlit\n├── data/\n│   └── cdp_neighbors.xlsx  # Contoh file data CDP\n└── img/                  # Ikon untuk perangkat jaringan\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"instalasi--penggunaan\"\u003eInstalasi \u0026amp; Penggunaan\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eInstalasi library yang dibutuhkan:\u003c/strong\u003e\u003c/p\u003e","title":"Proyek Visualisasi Jaringan CDP dengan Streamlit"},{"content":"Sering kali kita membutuhkan sebuah lingkungan sandbox atau lab virtual yang ringan untuk eksperimen, development, atau sekadar mencoba perintah-perintah sistem. Menggunakan Virtual Machine (VM) penuh terkadang terasa berlebihan. Artikel ini akan memandu Anda membangun \u0026ldquo;Bahrani Labs\u0026rdquo;: sebuah lab berbasis kontainer Docker yang bisa diakses via SSH, lengkap dengan persistensi data dan konfigurasi siap pakai.\nLab ini hadir dengan fitur esensial seperti akses SSH, user cisco dengan hak sudo, volume persisten untuk data Anda, healthcheck untuk memonitor layanan, kebijakan restart otomatis, dan zona waktu yang sudah disesuaikan untuk Indonesia (Asia/Jakarta).\nPrasyarat Sebelum memulai, pastikan sistem Anda telah memenuhi syarat berikut:\nDocker \u0026amp; Docker Compose: Sudah terpasang dan berjalan. Port Host: Ada satu port yang tidak terpakai di mesin Anda (dalam contoh ini kita gunakan 9022). Sistem Operasi: Tutorial ini diuji pada Linux, MacOS, atau Windows dengan WSL 2. Arsitektur Sederhana Desainnya sangat sederhana. Kita akan menjalankan satu kontainer dari image kustom yang kita bangun. Port 22 (SSH) di dalam kontainer akan dipetakan ke port 9022 di komputer Anda, dan semua data di dalam direktori /home/cisco akan disimpan secara persisten.\nSecara singkat, alur koneksinya adalah: User -\u0026gt; SSH Client -\u0026gt; Host:9022 -\u0026gt; Container:22.\nFile Konfigurasi: Dockerfile \u0026amp; Compose Kita hanya butuh dua file untuk menjalankan lab ini.\nDockerfile File ini berisi instruksi untuk membangun image kontainer kita, mulai dari instalasi paket hingga pembuatan user.\n# Gunakan base image Ubuntu versi stabil FROM ubuntu:24.04 # Install semua paket yang dibutuhkan dalam satu layer RUN apt-get update \u0026amp;\u0026amp; apt-get install -y \\ sudo \\ openssh-server \\ python3 \\ python3-pip \\ git \\ nano \\ net-tools \\ iputils-ping \\ netcat-openbsd \\ \u0026amp;\u0026amp; rm -rf /var/lib/apt/lists/* # Buat user \u0026#39;cisco\u0026#39; dan direktori home-nya RUN useradd -rm -d /home/cisco -s /bin/bash -g root -G sudo -u 1000 cisco # Set password default untuk user \u0026#39;cisco\u0026#39; (HARAP SEGERA GANTI) RUN echo \u0026#39;cisco:cisco\u0026#39; | chpasswd # Berikan hak sudo tanpa password untuk kemudahan di lingkungan lab RUN echo \u0026#39;cisco ALL=(ALL) NOPASSWD:ALL\u0026#39; \u0026gt;\u0026gt; /etc/sudoers # Buat direktori untuk SSH daemon RUN mkdir /var/run/sshd # Expose port SSH EXPOSE 22 # Perintah default untuk menjalankan SSH daemon di foreground CMD [\u0026#34;/usr/sbin/sshd\u0026#34;, \u0026#34;-D\u0026#34;] Penjelasan untuk setiap barisnya cukup sederhana: kita mulai dari ubuntu:24.04, menginstal semua tools, membuat user cisco dengan password cisco, memberikannya hak sudo, dan terakhir menjalankan server SSH saat kontainer dimulai.\ndocker-compose.yml File ini kita gunakan untuk mendefinisikan dan menjalankan kontainer bahrani-labs dengan semua konfigurasinya.\nversion: \u0026#34;3.9\u0026#34; services: bahrani-labs: container_name: bahrani-labs build: context: . dockerfile: Dockerfile image: bahrani-labs:latest restart: unless-stopped ports: - \u0026#34;9022:22\u0026#34; volumes: - bahrani-home:/home/cisco environment: TZ: \u0026#34;Asia/Jakarta\u0026#34; healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;sh\u0026#34;, \u0026#34;-c\u0026#34;, \u0026#34;nc -z 127.0.0.1 22 || exit 1\u0026#34;] interval: 30s timeout: 5s retries: 5 start_period: 20s volumes: bahrani-home: Di sini kita mendefinisikan semua properti layanan: build untuk membangun dari Dockerfile, restart: unless-stopped untuk menyala otomatis, ports untuk mapping port, volumes untuk persistensi data, dan healthcheck untuk memastikan SSH selalu berjalan.\nInstalasi dan Penggunaan Pertama Buat sebuah direktori baru di komputer Anda (misal, bahrani-labs). Di dalam direktori tersebut, buat file Dockerfile dan docker-compose.yml dengan isi seperti di atas. Buka terminal di direktori itu dan jalankan: docker compose up -d --build Setelah proses selesai, Anda bisa langsung terhubung via SSH: ssh cisco@localhost -p 9022 Masukkan password default: cisco. Perintah Sehari-hari Berikut adalah beberapa perintah dasar untuk mengelola lab Anda:\nMenghentikan Lab: docker compose stop Memulai Lab: docker compose start Melihat Logs: docker compose logs -f Masuk ke Kontainer (tanpa SSH): docker exec -it bahrani-labs bash Catatan Keamanan (Best Practices) Meskipun ini untuk lab, praktik keamanan dasar tetap penting:\nGanti Password: Hal pertama yang harus dilakukan setelah login adalah mengganti password default dengan perintah passwd. Gunakan SSH Key: Untuk keamanan lebih, nonaktifkan login dengan password dan gunakan SSH key. Batasi Akses Port: Di lingkungan produksi, batasi akses ke port 9022 hanya dari IP tepercaya menggunakan firewall. Kustomisasi dan Pengembangan Lanjutan Menambah Port Aplikasi: Ingin menjalankan server web? Tambahkan mapping port di docker-compose.yml, misalnya ports: [\u0026quot;9022:22\u0026quot;, \u0026quot;8080:80\u0026quot;]. Menambah Tools: Edit Dockerfile dan tambahkan paket lain yang Anda butuhkan di bagian apt-get install. Troubleshooting dan FAQ Tidak bisa SSH? Cek log (docker compose logs), pastikan tidak ada konflik port di 9022, dan periksa status healthcheck (docker inspect ...). Bagaimana cara update paket? Cara terbaik adalah dengan membangun ulang image: docker compose build --no-cache. Apakah bisa multi-user? Tentu. Anda bisa memodifikasi Dockerfile untuk membuat user tambahan. Kesimpulan \u0026ldquo;Bahrani Labs\u0026rdquo; adalah solusi ideal untuk siapa saja yang membutuhkan lingkungan sandbox Linux yang ringan, cepat, dan persisten. Ini sangat cocok untuk skenario eksperimen, belajar, atau bahkan sebagai target untuk otomasi build/test ringan.\nCall-to-Action Coba setup lab ini di mesin Anda, lalu kembangkan dengan menambahkan aplikasi web sederhana yang berjalan di port 8080! Ingin versi yang lebih aman untuk produksi? Nantikan artikel selanjutnya tentang hardening SSH di dalam kontainer Docker. ","permalink":"https://blog.bahrani.my.id/docs/catatan/membangun-lab-ssh-docker/","summary":"\u003cp\u003eSering kali kita membutuhkan sebuah lingkungan \u003cem\u003esandbox\u003c/em\u003e atau lab virtual yang ringan untuk eksperimen, development, atau sekadar mencoba perintah-perintah sistem. Menggunakan Virtual Machine (VM) penuh terkadang terasa berlebihan. Artikel ini akan memandu Anda membangun \u0026ldquo;Bahrani Labs\u0026rdquo;: sebuah lab berbasis kontainer Docker yang bisa diakses via SSH, lengkap dengan persistensi data dan konfigurasi siap pakai.\u003c/p\u003e\n\u003cp\u003eLab ini hadir dengan fitur esensial seperti \u003cstrong\u003eakses SSH\u003c/strong\u003e, user \u003ccode\u003ecisco\u003c/code\u003e dengan hak \u003cstrong\u003esudo\u003c/strong\u003e, \u003cstrong\u003evolume persisten\u003c/strong\u003e untuk data Anda, \u003cstrong\u003ehealthcheck\u003c/strong\u003e untuk memonitor layanan, kebijakan \u003cstrong\u003erestart otomatis\u003c/strong\u003e, dan zona waktu yang sudah disesuaikan untuk Indonesia (\u003ccode\u003eAsia/Jakarta\u003c/code\u003e).\u003c/p\u003e","title":"Membangun Lab SSH Pribadi dengan Docker: Bahrani Labs"}]