<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">
  <channel>
    <link>https://kusaeni.com/</link>
    <atom:link href="https://kusaeni.com/feed.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 18 Apr 2026 06:54:58 GMT</lastBuildDate>
    <language>id</language>
    <generator>Lume 3.2.4</generator>
    <item>
      <title>Strange Houses</title>
      <link>https://kusaeni.com/baca/strange-houses-uketsu/</link>
      <guid isPermaLink="false">https://kusaeni.com/baca/strange-houses-uketsu/</guid>
      <content:encoded>
        <![CDATA[<div class="selayang"><div class="selayang__cover"><img alt="Strange Houses" class="layang" src="https://ik.imagekit.io/hjse9uhdjqd/buku/strange_houses_uketsu%20Medium_pprwwt90e.jpeg"></div><div class="selayang__meta"><dl><dt>Penulis</dt><dd>Uketsu</dd><dt>Bahasa</dt><dd>Bahasa Inggris</dd><dt>Format</dt><dd>epub</dd><dt>ISBN</dt><dd>9781805335375∷ 2025</dd><dt>Rating</dt><dd><a href="https://kusaeni.com/baca/rating">4 dari 5</a></dd><dt>Beli dimana?</dt><dd><a href="https://pushkinpress.com/book/strange-houses/" target="_blank">Pushkinpress</a></dd></dl></div></div><p>Ane udah lama punya ebook ini namun belum tertarik untuk membacanya, sungguh karena ane sudah terikat dengan gaya penulisan Seishi Yokomizo sehingga ketika memulai membaca tulisan dari pengarang (Jepang) lainnya rasa-rasanya sudah tidak begitu menarik. Apalagi kemudian beberapa buku lainnya tidak begitu bagus (seperti Yukito Ayatsuji dan Akimitsu Takagi － menurut ane). Sehingga ketika mendapatkan ebook ini muncul rasa malas untuk membaca.</p><p>Rencana awalnya adalah membaca buku ini untuk menemani perjalanan naik kereta, namun saat sudah di atas kereta malah malas untuk buka <a href="https://kusaeni.com/tags/kindle/">Kindle</a>, <em>al hasil</em> dia bersemayam dengan tenang untuk beberapa lama sampai ane ada kesempatan untuk membacanya.</p><h2 id="strange-houses" tabindex="-1">Strange Houses <a class="header-anchor" href="https://kusaeni.com/baca/strange-houses-uketsu/#strange-houses">#</a></h2><p>Rumah-rumah yang aneh. Pada suatu hari seorang penulis lepas (cerita dari sudut pandang orang pertama, mari kita sebut <strong>Uketsu</strong>) mendapatkan permintaan saran oleh seorang kawannya, <strong>Yanaoka</strong> yang mengiriminya <em>layout</em> atau denah dari rumah. Diketahui si Yanaoka ini berniat membeli rumah dengan 2 lantai karena sebentar lagi akan memiliki anak. Yanaoka dan istri sudah sangat cocok dengan rumah yang hendak dibelinya ini karena lokasinya strategis sekaligus desain rumahnya sangat nyaman untuk ditempati. Hanya saja dia merasa ada yang aneh dengan gambar denah ruangan yang diberikan oleh agensi penjualan rumah.</p><p>Menurut denah ada ruangan aneh yang tidak wajar dan tidak jelas fungsinya.</p><p><img alt="Layout rumah pertama" src="https://ik.imagekit.io/hjse9uhdjqd/buku/strange_houses_uketsu_layout.png?updatedAt=1776003072408"></p><p>Karena tidak paham dengan hal semacam ini, Uketsu kemudian menghubungi sahabatnya bernama <strong>Kurihara</strong> yang seorang arsitek. Menurut Kurihara memang ada kejanggalan di denah itu, terutama adanya ruangan kosong yang tidak bermanfaat di lantai bawah. Menurut (otak konspirasi) Kurihara jangan - jangan ruangan kosong itu sengaja dibikin untuk melakukan kejahatan (pembunuhan), apalagi saat denah lantai atas ditumpuk. Ditemukan kemungkinan ruangan kosong di lantai bawah adalah lorong yang dipakai untuk seseorang untuk menyelinap masuk ke Kamar Mandi dan melakukan pembunuhan disitu. Masalahnya adalah dimensi ruangan tersebut cukup sempit sehingga tidak bisa dilalui oleh orang dewasa, maka kemungkinan yang bisa melakukan pembunuhan adalah anak - anak.</p><p>Dengan analisa ini, Uketsu kemudian menghubungi Yanaoka untuk menyampaikan sarannya namun Uketsu terkejut karena Yanaoka membatalkan rencana membeli rumah ini karena ada kejadian yang tak terduga, yaitu ditemukan mayat seorang laki - laki di dekat rumah itu dengan kondisi tangan kiri hilang.</p><p>Kasus ditutup, namun tidak buat Uketsu karena denah rumah dan analisa Kurihara terus membekas dalam hatinya. Kemudian Uketsu membuat artikel pendek di majalah tentang rumah tersebut dengan menghilangkan detail tentang lokasi untuk privasi. Tak disangka dia mendapatkan banyak respon dari pembaca, salah satunya dari seseorang mengaku bernama <strong>Yuzuki Miyae</strong> yang merasa bahwa artikel tentang denah rumah ini berhubungan dengan kematian suaminya <strong>Kyoichi Miyae</strong> (si mayat dengan tangan kiri hilang).</p><p>Dari Yuzuki Miyae, Uketsu mendapatkan kembali denah rumah lain yang memiliki keanehan yang sama, yaitu ada ruangan yang tidak wajar dengan sudut mati tidak terlihat dari luar. Setelah ditelusuri ternyata pemilik rumahnya sama yaitu <strong>Keita Katabuchi</strong>. Kurihara merasa curiga dengan Yuzuki dan berpesan agar Uketsu berhati - hati dengan dia karena menurut catatan pemerintah Kyoichi Miyae belum pernah menikah, tapi kenapa Yuzuki mengaku sebagai istri mendiang?. Setelah di konfrontasi akhirnya Yuzuki jujur bahwa dia memang bukan istri dari Kyoichi melainkan <strong>Yuzuki Katabuchi</strong> saudara ipar dari Keita.</p><h3 id="klan-katabuchi-%26-ritual-potong-tangan" tabindex="-1">Klan Katabuchi &amp; ritual potong tangan <a class="header-anchor" href="https://kusaeni.com/baca/strange-houses-uketsu/#klan-katabuchi-%26-ritual-potong-tangan">#</a></h3><p>Pada tahun 1920-an keluarga Katabuchi dengan kepala keluarganya bernama <strong>Kaei Katabuchi</strong> menjadi kaya raya karena sukses dengan bisnisnya. Kaei memiliki 3 orang anak yaitu</p><div class="table_merah"><table><thead><tr><th style="text-align:left">Nama</th><th style="text-align:left">Urutan</th><th style="text-align:left">Status</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Soichiro</strong></td><td style="text-align:left">Anak laki - laki tertua dari istri sah</td><td style="text-align:left">Keluarga Utama</td></tr><tr><td style="text-align:left"><strong>Chizuru</strong></td><td style="text-align:left">Anak perempuan dari istri sah</td><td style="text-align:left">Keluarga Utama</td></tr><tr><td style="text-align:left"><strong>Seikichi</strong></td><td style="text-align:left">Anak laki - laki termuda dari istri simpanan</td><td style="text-align:left">Keluarga Cabang</td></tr></tbody></table></div><p>Ketika usia sudah tua, Kaei harus memilih penerus dari Klan Katabuchi namun anak laki - laki tertuanya tidak memiliki kecakapan dalam berkerja seperti Kaei. Kerjaannya tiap hari bermain - main dengan saudari perempuannya. Sedangkan Seikichi mewarisi keterampilan berbisnis ayahnya, namun Kaei tetap memilih Soichiro sebagai penerus kepala keluarga Katabuchi. Kecewa, Seikichi akhirnya memilih untuk berpisah dan membangun bisnisnya sendiri.</p><p>Sebelum meninggal Kaei menjodohkan Soichiro dengan <strong>Ushio</strong> seorang wanita yang sebelumnya adalah pelayan di <em>mansion</em> keluarga Katabuchi. Kaei menganggap bahwa Ushio cocok untuk Soichiro karena dipandang sebagai wanita yang tenang, tangguh, dan tabah. Namun dalam perjalanan rumah tangga mereka tertempa badai. Binis keluarga Katabuchi hancur dan Soichiro melakukan hubungan terlarang dengan Chizuru sampai kemudian Chizuru mengandung anak kembar.</p><p>Ushio yang sakit hati kemudian bunuh diri dengan memotong pergelangan tangan kirinya.</p><p>Seikichi yang sudah sukses dan kaya raya kemudian kembali ke <em>mansion</em> Katabuchi berusaha menyelamatkan “muka” Klan Katabuchi, dia mengambil alih bisnis dan “mengurung” Keluarga Utama di <em>mansion</em> di Gunung dan memberikan sebagian tanah, pelayan, dan harta kepada mereka. Ini menimbulkan sakit hati kepada anggota Keluarga Utama namun mereka tidak berdaya.</p><p>Seikichi sendiri sudah menikah setidaknya dengan 4 wanita berbeda dan masing - masing memiliki keturunan. Sedangkan Chizuru akhirnya melahirkan anak kembarnya, 2 anak laki - laki namun salah satu anaknya cacat tidak memiliki telapak tangan. Pada tahun itu, hal ini dianggap sebagai kutukan dari mendiang Ushio yang sakit hati padahal sebenarnya karena hasil hubungan <em>incest</em> yang membuat struktur tubuh hasil hubungannya sering kali “berbeda”. Ketakutan dengan kutukan Ushio, membuat Keluarga Utama Klan Katabuchi ini semakin mengasingkan diri.</p><p>Pada suatu saat, datang seorang dukun wanita bernama <strong>Rankyo</strong> ke kediaman keluarga Katabuchi. Dia mengatakan bisa menolak bala dari kutukan Ushio. Keluarga Katabuchi percaya penuh dengan dukun Rankyo karena dia menyebutkan beberapa fakta terkait keluarga Katabuchi yang rahasia. Rankyo memberikan ritual dengan syarat dan aturan agar keluarga Katabuchi terhindar dari amarah Ushio, yaitu</p><ol><li>Anak kembar dari Chizuru adalah Asano dan Momota (yg cacat). Momota harus disembunyikan di ruangan khusus dan tidak boleh terkena sinar matahari. Pada ulang tahunnya yang ke-10, dia harus membunuh salah satu anak dari keluarga Cabang yaitu anak Seikichi yang seumuran,</li><li>Setiap tahun sampai usia 13 tahun, Momota harus membunuh anak - anak itu (total 3 anak),</li><li>Asano (atau anak seumuran) bertindak sebagai pembantu dalam usaha pembunuhan,</li><li>Tangan kiri korban harus dipotong sebatas pergelangan tangan dan kemudian dipersembahkan di makam Ushio.</li></ol><p>Akhirnya ritual ini menjadi sebuah tradisi turun temurun dari Klan Katabuchi sampai saat ini, apalagi jika dari keturunannya ada yang lahir tanpa telapak tangan kiri. Namun rahasia dari Klan Katabuchi tidak hanya itu, melainkan ternyata mereka mempunyai anak laki - laki ketiga setelah Soichiro dan Seikichi yaitu <strong>Shigehiru</strong> yang kemudian menjadi kakek dari Yuzuki Katabuchi.</p><p>Lalu siapakah Rankyo? Siapakah Keita dan bagaimanakah akhir dari ritual keluarga Katabuchi ini?</p><h3 id="catatan" tabindex="-1">Catatan <a class="header-anchor" href="https://kusaeni.com/baca/strange-houses-uketsu/#catatan">#</a></h3><p>Novel ini pendek, hanya terdiri dari 4 bab yang sebagian besar berisi percakapan - percakapan saja. Ditulis seperti naskah skenario film, meski begitu ketegangan tetap terbangun dengan manis. Pelan - pelan tak terasa namun pada saatnya membuat kengerian yang nyata.</p><div class="bukukuku"><h5>buku lain yang mungkin kamu suka</h5><div class="relasi_bukuku"><a class="bukuku" href="https://kusaeni.com/baca/murder-at-black-cat-cafe/"> <div class="relasi_bukuku_cover"><img alt="Murder at The Black Cat Café" src="https://ik.imagekit.io/hjse9uhdjqd/buku/seishi%20yokomizo%20-%20murder%20at%20black%20cat%20cafe_js9f-vDmD.jpeg"></div> </a><a class="bukuku" href="https://kusaeni.com/baca/the-inugami-curse/"> <div class="relasi_bukuku_cover"><img alt="The Inugami Curse" src="https://ik.imagekit.io/hjse9uhdjqd/buku/TheInugamiCurses_aLfIHO09R.jpeg?updatedAt=1734352464431"></div> </a><a class="bukuku" href="https://kusaeni.com/baca/malice/"> <div class="relasi_bukuku_cover"><img alt="Malice : Catatan Pembunuhan sang Novelis" src="https://ik.imagekit.io/hjse9uhdjqd/tr:n-cover/buku/malice_1GM7H7NhPlD.jpg"></div> </a><a class="bukuku" href="https://kusaeni.com/baca/thenewcomer/"> <div class="relasi_bukuku_cover"><img alt="The Newcomer" src="https://ik.imagekit.io/hjse9uhdjqd/tr:n-cover/buku/thenewcomer_jNnlkJXcfB.jpg"></div> </a><a class="bukuku" href="https://kusaeni.com/baca/murder-in-the-crooked-house/"> <div class="relasi_bukuku_cover"><img alt="Murder in The Crooked House" src="https://ik.imagekit.io/hjse9uhdjqd/tr:n-cover/buku/murder_crocked_house_-KeZxKoOZ.jpg"></div> </a></div></div><p>Ane tidak mengira novel ini <em>creepy</em>, apalagi pelaku pembunuhannya adalah anak - anak (yang di <em>brainwashed</em> oleh para orang tuanya) untuk membunuhi saudara mereka (meski tidak diceritakan secara <em>explisit</em> tentang pembunuhannya). Akhir dari novel ini pun sedikit mengganggu, tidak sedih tidak pula <em>happy ending</em> melainkan menyisakan ruang kosong bagi pembaca untuk menebak apakah sebenarnya kasus ini benar - benar sudah tertutup atau belum?. Ruang kosong yang sama seperti di denah rumah yang aneh.</p><p>Novel ini juga tersedia versi manga dengan judul <a href="https://en.wikipedia.org/wiki/The_Strange_House_(manga)">The Strange House/Hen na le</a>, di versi manga-nya lebih lengkap daripada versi novel terutama di bagian akhir dan pengungkapan.</p><p>Sekilas tentang Uketsu, dia seorang <a href="https://www.youtube.com/@uketsu">youtuber</a> yang sering membuat film pendek. Bahkan versi <em>audiovisual</em> dari novel ini tersedia di kanal youtube-nya. Dia sudah menulis beberapa novel yang langsung menjadi <em>best seller</em> diantaranya Strange Houses dan Strange Pictures. Meski sudah populer, sosok Uketsu sendiri masih misteri sampai sekarang karena setiap tampil dia selalu memakai celana dan jaket hitam dan menutupi wajahnya dengan topeng dari bubur kertas yang dikeringkan.</p><p>Ane beri <em>rating</em> bintang 4 dari 5 karena memang novel yang ini enak untuk dibaca dan terasa <em>fresh</em> dibandingkan <em>Japanese crime mistery</em> novel yang sebelumnya ane baca. <abbr title="For Your Information">FYI</abbr> arti dari bintang 4 dari ane adalah <mark>“<em>Buku yang bagus dan saya rekomendasikan untuk dibaca</em>”</mark>.</p><p>Ane sedang membaca buku Uketsu lainnya yaitu Strange Pictures harapan ane memiliki kualitas yang serupa atau mungkin lebih baik?, semoga.</p><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KP2MW2VGCYD6Z6Q4WT58TGEC">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KP2MW2VGCYD6Z6Q4WT58TGEC"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Serba-serbi package manager di FreeBSD</title>
      <link>https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/</guid>
      <content:encoded>
        <![CDATA[<nav class="toc"><h4>Daftar Isi</h4><ol><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mempergunakan-pkg">Mempergunakan PKG</a> <ul><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#pengaturan-pkg">Pengaturan PKG</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mencari%2C-lihat-deskripsi%2C-dan-meng-install-package">Mencari, lihat deskripsi, dan meng-install package</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#menghapus-package">Menghapus package</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mengunci-package-supaya-tidak-dirubah">Mengunci package supaya tidak dirubah</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#statistik">Statistik</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#query-pkg">Query PKG</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#audit">Audit</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#jika-pkg-rusak-tak-bisa-dipakai">Jika pkg rusak tak bisa dipakai</a></li></ul></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mempergunakan-port%E2%80%99s">Mempergunakan Port’s</a> <ul><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mempersiapkan-port%E2%80%99s">Mempersiapkan Port’s</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#memasang-aplikasi-dari-port%E2%80%99s">Memasang aplikasi dari Port’s</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#menghapus-package-dari-ports">Menghapus package dari Ports</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#meng-upgrade-ports">Meng-upgrade Ports</a></li></ul></li><li><a href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#kesimpulan">Kesimpulan</a></li></ol></nav><div class="postnotes info"><p>⚠️ Artikel ini masih dalam proses dan akan terus diupdate.</p></div><p>Meski sudah banyak aplikasi yang dibawa di dalam paket <em>base</em>-nya namun FreeBSD tetap menyediakan alat untuk meng<em>install</em> aplikasi pihak ketiga, mengelola atau meng<em>update</em>nya. Disediakan 2 alat dan 2 cara berbeda yaitu dengan FreeBSD <em>ports collections</em> yaitu cara meng<em>install</em> aplikasi lewat <em>build source code</em>. Cara lainnya adalah memasang aplikasi dari <em>pre-built binaries</em> dengan <a href="https://man.freebsd.org/cgi/man.cgi?query=pkg&amp;sektion=8&amp;format=html"><code>pkg(8)</code></a></p><p>Memasang dari <em>ports collections</em> biasanya dilakukan jika di dalam <em>repository</em> resmi FreeBSD sebuah paket belum ter<em>update</em> karena biasanya memang di <em>ports</em> lebih dahulu diluncurkan. <a href="https://www.freshports.org/">Freshports</a> adalah situs yang bisa dipergunakan untuk melacak rilis dari <em>ports</em>, resminya juga ada yaitu melalui <a href="https://ports.freebsd.org/cgi/ports.cgi">FreeBSD Ports Collections</a>.</p><h2 id="mempergunakan-pkg" tabindex="-1">Mempergunakan PKG <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mempergunakan-pkg">#</a></h2><p>Semua versi FreeBSD sudah datang dengan <code>pkg</code> secara standar. Ketika pertama kali memakai sistem FreeBSD atau saat di awal membuat <code>jail</code> maka perlu melakukan <code>pkg bootstrap</code> untuk mengunduh paket <code>pkg</code> (jika di sistem belum ada) dan memasangnya, jika ternyata <code>pkg</code> sudah ada di dalam sistem maka perintah ini tidak akan berpengaruh apa - apa. Jika perintah ini diberi <em>flag</em> <code>-f</code> sehingga menjadi <code>pkg bootstrap -f</code> maka akan melakukan pengunduhan dan pemasangan paket <code>pkg</code> dan mengabaikan apakah <code>pkg</code> sudah ada atau belum.</p><p>Setelah <code>pkg</code> tersedia bisa dipergunakan dengan memasukkan perintah - perintah sebagai berikut.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">pkg bootstrap</span></span>
<span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">pkg</span></span>
<span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">pkg update</span></span>
<span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">pkg upgrade</span></span>
</code></pre><aside>Perintah di atas adalah beberapa perintah populer yang paling sering dipergunakan, namun <code>pkg</code> sendiri sebenarnya memiliki lebih banyak perintah yang bisa dilihat dengan memasukkan perintah <code>pkg help</code>.</aside><h3 id="pengaturan-pkg" tabindex="-1">Pengaturan PKG <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#pengaturan-pkg">#</a></h3><p>Perintah <code>pkg update</code> akan membuat <code>pkg</code> mengunduh data <em>repository</em> FreeBSD dan menyimpannya di lokal. Umumnya <code>pkg</code> akan menghubungi server <code>pkg.FreeBSD.org</code> dan kemudian akan dialihkan ke server terdekat berdasarkan lokasi geografi. Untuk Asia Tenggara lokasi server terdekat ada di Kuala Lumpur, namun server ini kurang memiliki akses yang cepat sehingga pengunduhan sering terkendala.</p><p>Namun ada sebuah aplikasi yang bagus yang biasanya dipergunakan untuk menentukan posisi server yang sesuai dan cepat, nama aplikasinya adalah <code>fastest_pkg</code>. Berikut cara memasang dan pakainya.</p><div class="postnotes kuning-gading"><p>⚠️ Semua perintah terkait <code>pkg</code> biasanya membutuhkan elevasi ke <i>superuser</i>, oleh karena ane jalankan sebagai <i>user</i> biasa maka ane butuh <code>doas</code> untuk menaikkan <i>privileges</i> ane ke selevel dengan <code>root</code>.</p><p><code>doas</code> bisa dipasang dengan perintah <code># pkg install doas</code> atau <code># pkg install opendoas</code> untuk mendapatkan <code>doas</code> yang lebih mirip dengan di OpenBSD.</p></div><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg search fastest_pkg</span></span>
<span class="token output">py311-fastest_pkg-0.2.3        Script to find the fastest pkg mirror
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install py311-fastest_pkg</span></span>
<span class="token output">...

</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas fastest_pkg</span></span>
<span class="token output">pkg0.your.freebsd.org: 378.5 kB/s
pkg0.son.freebsd.org: 0.0 B/s
pkg0.sjb.freebsd.org: 351.4 kB/s
pkg0.twn.freebsd.org: 0.0 B/s
pkg0.kul.freebsd.org: 0.0 B/s
pkg0.bbt.freebsd.org: 0.0 B/s
pkg0.jinx.freebsd.org: 0.0 B/s
pkg0.kwc.freebsd.org: 18.4 MB/s
pkg0.syd.freebsd.org: 636.2 kB/s
pkg0.pao.freebsd.org: 772.4 kB/s
pkg0.tuk.freebsd.org: 1.1 MB/s
pkg0.bra.freebsd.org: 234.9 kB/s
pkg0.nyi.freebsd.org: 275.3 kB/s

Fastest:
pkg0.kwc.freebsd.org: 18.4 MB/s


Write configuration:
mkdir -p /usr/local/etc/pkg/repos/
echo 'FreeBSD: { url: "http://pkg0.kwc.freebsd.org/${ABI}/latest", mirror_type: "NONE" }' \
        &gt; /usr/local/etc/pkg/repos/FreeBSD.conf
</span></code></pre><p>Dari hasil <code>fastest_pkg</code> seperti di atas ditemukan bahwa server <code>pkg0.kwc.freebsd.org</code> adalah server dengan kecepatan pengunduhan paling baik dibandingkan yang lainnya. Di atas juga disebutkan cara untuk membuat <code>pkg</code> mempergunakan server <code>pkg0.kwc.freebsd.org</code> sebagai pilhan utama.</p><p>Setelah <code>FreeBSD.conf</code> selesai dibuat, maka paksa <code>pkg</code> untuk mengunduh ulang definisi repo ke lokal dengan perintah <code>pkg update -f</code>, seharusnya kecepatan pengunduhan akan naik secara signifikan/menyesuaikan.</p><p><em>File</em> <code>FreeBSD.conf</code> adalah <em>file</em> khusus yang dipergunakan oleh FreeBSD untuk merubah atau menimpa pengaturan pada <code>pkg</code>. Pengaturan asli dari <code>pkg.conf</code> ada di <em>path</em> <code>/etc/pkg/FreeBSD.conf</code> namun mengubah isi dari <em>file</em> ini <mark class="pink">sangat tidak direkomendasikan</mark>. Untuk merubah pengaturan, FreeBSD merekomendasikan <em>file</em> <code>FreeBSD.conf</code> yang berada di <em>path</em> <code>/usr/local/etc/pkg/repos/FreeBSD.conf</code> dimana semua pengaturan yang berada di bawah <em>path</em> <code>/usr/local</code> <mark>hanya akan dijalankan secara khusus untuk <em>user</em> yang bersangkutan</mark>, sedangkan pengaturan di bawah <em>path</em> <code>/etc/</code> akan berlaku menyeluruh.</p><p>Salah satu pengaturan yang biasanya sering dipakai oleh pengguna FreeBSD adalah menentukan jenis <em>update</em> repositori dimana ada 2 pilihan utama yaitu <code>latest</code> dan <code>quarterly</code>. Perbedaan utamanya sebagai berikut</p><table><thead><tr><th style="text-align:center">Jenis Repo</th><th style="text-align:center">Keterangan</th></tr></thead><tbody><tr><td style="text-align:center"><code>Latest</code></td><td style="text-align:center">Berisi versi terbaru dari masing - masing package alias lebih <em>up to date</em> namun memiliki resiko atas kompatibilitas.</td></tr><tr><td style="text-align:center"><code>Quarterly</code></td><td style="text-align:center">Berisi versi yang lebih stabil, di<em>update</em> setiap 3 bulan sekali.</td></tr></tbody></table><p>Cara untuk berpindah dari repo <code>latest</code> ke <code>quarterly</code> atau sebaliknya bisa dilakukan dengan merubah pengaturan di <em>file</em> <code>FreeBSD.conf</code> sebagai berikut</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas ee /usr/local/etc/pkg/repos/FreeBSD.conf</span></span>
<span class="token output">url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly"
</span></code></pre><aside>Rubah pada tulisan <code>quarterly</code> atau <code>latest</code> sesuaikan dengan repo yang diinginkan. <br><code>ee</code> adalah text editor bawaan dari FreeBSD</aside><h3 id="mencari%2C-lihat-deskripsi%2C-dan-meng-install-package" tabindex="-1">Mencari, lihat deskripsi, dan meng-<em>install package</em> <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mencari%2C-lihat-deskripsi%2C-dan-meng-install-package">#</a></h3><p>Setelah pengaturan selesai dan <em>repository</em> sudah di<em>update</em>, maka perintah untuk memasang sebuah atau lebih <em>package</em> bisa dilakukan dengan perintah <code>pkg install</code>. Namun penting untuk melakukan pencarian terlebih dahulu karena <em>default</em>nya FreeBSD akan menampilkan beberapa pilihan versi <em>package</em> jika tersedia apalagi jika memakai repositori <code>latest</code>. Sebagai contoh akan mencari dan memasangan <a href="https://www.vim.org/">vim</a>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">pkg search vim</span></span>
<span class="token output">...
vim-9.2.0272            Improved version of the vi editor (console flavor)
vim-gtk2-9.2.0272       Improved version of the vi editor (gtk2 flavor)
vim-gtk3-9.2.0272       Improved version of the vi editor (gtk3 flavor)
vim-lsp-0.1.4.198       Async language server protocol plugin for vim and neovim
vim-motif-9.2.0272      Improved version of the vi editor (motif flavor)
vim-tiny-9.2.0272       Improved version of the vi editor (tiny flavor)
vim-x11-9.2.0272        Improved version of the vi editor (x11 flavor)
...
</span></code></pre><p>Ditemukan banyak versi <em>package</em> dari <code>VIM</code>, untuk mengetahui uraian atau deskripsi dari sebuah <em>package</em> maka gunakan perintah <code>pkg info</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">pkg info vim</span></span>
<span class="token output">vim-9.2.0272
Name           : vim
Version        : 9.2.0272
Installed on   : Sat Apr  4 10:37:32 2026 WIB
Origin         : editors/vim
Architecture   : FreeBSD:15:amd64
Prefix         : /usr/local
Categories     : editors
Licenses       : VIM
Maintainer     : adamw@FreeBSD.org
WWW            : https://www.vim.org/
Comment        : Improved version of the vi editor (console flavor)
...
...
</span></code></pre><p>Kemudian pasang <em>package</em> tersebut dengan perintah</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install vim</span></span>
<span class="token output">doas (poes@kocheng) password: 
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
  vim: 9.2.0272 [FreeBSD-ports]

Number of packages to be installed: 1

The process will require 42 MiB more space.

Proceed with this action? [y/N]: y
[1/1] Installing vim-9.2.0272...
[1/1] Extracting vim-9.2.0272: 100%
</span></code></pre><h3 id="menghapus-package" tabindex="-1">Menghapus <em>package</em> <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#menghapus-package">#</a></h3><p>Ada 2 perintah yang memiliki fungsi untuk menghapus <em>package</em> dengan <code>pkg</code> yaitu <code>pkg delete</code> dan <code>pkg remove</code>, meski berbeda namun memiliki fungsi yang sama. Namun di <a href="https://man.freebsd.org/cgi/man.cgi?pkg">man pages pkg</a> perintah <code>pkg remove</code> tidak disebut sehingga untuk kompatibilitas pergunakan perintah <code>pkg delete</code>.</p><p>Cara pakainya seperti ini</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg delete vim</span></span>
<span class="token output">Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
  vim: 9.2.0272

Number of packages to be removed: 1

The operation will free 42 MiB.

Proceed with deinstalling packages? [y/N]: y
[1/1] Deinstalling vim-9.2.0272...
[1/1] Deleting files for vim-9.2.0272: 100%
</span></code></pre><p>Ada juga perintah <code>autoremove</code> yang tugasnya mencari dan menghapus <em>package</em> yang sudah tidak dipakai lagi, biasanya adalah <em>package</em> yang menjadi <em>dependecies</em> dari <em>build</em> <em>package</em> utama.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg autoremove</span></span>
<span class="token output">doas (poes@oyenBSD) password:
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 67 packages:

Installed packages to be REMOVED:
        abseil: 20250127.1_1
        alsa-lib: 1.2.15.3
        at-spi2-core: 2.56.8
        basu: 0.2.1
        bsddialog: 1.1
        ...
        
Number of packages to be removed: 67

The operation will free 269 MiB.

Proceed with deinstalling packages? [y/N]: y
[ 1/67] Deinstalling abseil-20250127.1_1...
[ 1/67] Deleting files for abseil-20250127.1_1: 100%
...
$
</span></code></pre><p><code>pkg autoremove</code> bisa dipakai untuk membersihkan ruang yang dipakai oleh banyak <em>package</em> sehingga membuat kapasitas <em>storage</em> menjadi lebih lega. Namun ada perintah lain yang juga bisa dipakai yaitu <code>pkg clean</code>, yang ini tugasnya menghapus/membersihkan isi dari <em>local cache</em> dari <em>package</em> yang terunduh.</p><h3 id="mengunci-package-supaya-tidak-dirubah" tabindex="-1">Mengunci <em>package</em> supaya tidak dirubah <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mengunci-package-supaya-tidak-dirubah">#</a></h3><p>Jika ane ingin agar sebuah atau lebih <em>package</em> tidak bisa dirubah (di<em>reinstall</em>, di<em>upgrade</em>, dimodifikasi, bahkan dihapus) maka ane akan pakai <code>pkg lock</code> untuk urusan ini. Bermanfaat jika ingin tetap memakai versi tertentu dari sebuah <em>package</em>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">vim --version</span></span>
<span class="token output">VIM - Vi IMproved 9.2 (2026 Feb 14, compiled Mar 31 2026 01:05:15)
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg lock vim</span></span>
<span class="token output">doas (poes@oyenBSD) password:
vim-9.2.0272: lock this package? [y/N]: y
Locking vim-9.2.0272
</span></code></pre><p>untuk <em>unlock</em></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg unlock vim</span></span>
<span class="token output">doas (poes@oyenBSD) password:
vim-9.2.0272: unlock this package? [y/N]: y
Unlocking vim-9.2.0272
</span></code></pre><h3 id="statistik" tabindex="-1">Statistik <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#statistik">#</a></h3><p>Untuk menampilkan statistik database <code>pkg</code> gunakan <code>pkg stats</code> yang akan memberikan info jumlah <em>package</em> yang terpasang dan <em>disk storage</em> yang dipergunakan.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg stats</span></span>
<span class="token output">Local package database:
  Installed packages: 231
  Disk space occupied: 2 GiB

Remote package database(s):
  Number of repositories: 2
  Packages available: 37306
  Unique packages: 37306
  Total size of packages: 160 GiB
</span></code></pre><h3 id="query-pkg" tabindex="-1">Query PKG <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#query-pkg">#</a></h3><p>Mendapatkan informasi sebuah paket selain dengan <code>pkg info</code> bisa juga dengan <code>pkg-query</code> (<a href="https://man.freebsd.org/cgi/man.cgi?query=pkg-query">man</a>) sebuah <em>tool</em> yang dibuat khusus untuk meng-<em>query</em> data informasi dari sebuah atau lebih <em>package</em> meski lebih sering dipakai untuk melakukan <em>tracing</em>.</p><p>Sebagai contoh ingin melihat daftar <em>package</em> mana saja yang pakai <code>jpeg-turbo</code> sebagai <em>reverse dependencies</em>-nya</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">pkg query %ro jpeg-turbo</span></span>
<span class="token output">graphics/tiff
graphics/openjpeg
graphics/libraw
graphics/lcms2
graphics/php81-gd
multimedia/libv4l
graphics/gd
graphics/webp
</span></code></pre><aside>Hasilnya <code>jpeg-turbo</code> dibutuhkan oleh beberapa <i>package</i> seperti <code>tiff</code>, <code>openjpeg</code>, dan <code>php81-gd</code>.</aside><p>Sedangkan untuk melihat <em>dependencies</em> dari sebuah <em>package</em> (misal <code>vnstat</code>) bisa dengan perintah berikut</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg query %dn-%dv vnstat</span></span>
<span class="token output">sqlite3-3.50.4_2,1
libgd-2.3.3_13,1
</span></code></pre><aside>Hasilnya <code>vnstat</code> membutuhkan <code>sqlite</code> dan <code>libgd</code> sebagai <i>dependencies</i>-nya.</aside><h3 id="audit" tabindex="-1">Audit <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#audit">#</a></h3><p><a href="https://www.freebsd.org/security/advisories/">FreeBSD Security Advisories</a> adalah informasi resmi dari FreeBSD terkait masalah keamanan di <em>base system</em> FreeBSD misalnya soal jaringan, kernel, sistem inti lainnya. Informasi ini berisi tentang penjelasan masalah yang ditemukan dan cara penyelesaiannya. <code>pkg</code> memberikan perintah <code>audit</code> untuk memeriksa apakah di dalam sistem saat ini ditemukan masalah sesuai dengan informasi dari FreeBSD Security Advisories. Untuk memeriksanya gunakan perintah <code>pkg audit -F</code></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg audit -F</span></span>
<span class="token output">doas (poes@oyenBSD) password:
vulnxml file up-to-date
python311-3.11.15 is vulnerable:
  Python -- poplib module, when passed a user-controlled command, can have additional commands injected using newlines
  CVE: CVE-2025-15367
  WWW: https://vuxml.FreeBSD.org/freebsd/6d3488ae-2e0f-11f1-88c7-00a098b42aeb.html

  Python -- imaplib module, when passed a user-controlled command, can have additional commands injected using newlines
  CVE: CVE-2025-15366
  WWW: https://vuxml.FreeBSD.org/freebsd/0be929a5-2e0f-11f1-88c7-00a098b42aeb.html

  Python -- The webbrowser.open() API allows leading dashes
  CVE: CVE-2026-4519
  WWW: https://vuxml.FreeBSD.org/freebsd/9fdad262-2e0f-11f1-88c7-00a098b42aeb.html

openexr-3.4.8 is vulnerable:
  openexr -- multiple vulnerabilities
  CVE: CVE-2026-34378
  CVE: CVE-2026-34379
  CVE: CVE-2026-34380
  CVE: CVE-2026-34588
  CVE: CVE-2026-34589
  WWW: https://vuxml.FreeBSD.org/freebsd/adb096d4-2e72-11f1-acc1-339a1a6999b0.html

3 problem(s) in 1 package(s) found.
</span></code></pre><p>Hasil dari perintah ini adalah informasi tentang kerentanan. Sebagai contoh di atas setidaknya ada 3 masalah dari 1 <em>package</em> yaitu <code>python</code>. Informasi lebih lengkap bisa diperiksa dengan mengakses halaman WWW di tautan yang diberikan. Sebagai contoh masalah di <code>python</code> disebutkan bahwa itu merupakan tindak lanjut dari temuan oleh laporan Python Software Foundation Security Developer.</p><p>Cara penyelesaiannya biasanya dengan menunggu <em>patch</em> resmi dari FreeBSD atau <em>upgrade</em> ke versi lebih tinggi, dengan <code>pkg</code> (nunggu <em>patch</em>) atau lewat Freshport.</p><h3 id="jika-pkg-rusak-tak-bisa-dipakai" tabindex="-1">Jika <code>pkg</code> rusak tak bisa dipakai <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#jika-pkg-rusak-tak-bisa-dipakai">#</a></h3><p>Karena proses <em>update</em> atau <em>upgrade</em> yang keliru, belum selesai, <em>database corrupt</em>, atau perubahan dari jenis repo yang gagal bisa membuat <code>pkg</code> tidak bisa dipergunakan. Oleh karena itu meng-<em>install</em> ulang <code>pkg</code> mutlak diberikan, disini alat kecil bernama <code>pkg-static</code><a href="https://man.freebsd.org/cgi/man.cgi?query=pkg-static&amp;sektion=8&amp;n=1">(8)</a> bisa dipergunakan. <code>pkg-static</code> adalah sebuah aplikasi yang (sudah tersedia di <code>base</code>) fungsinya sama dengan <code>pkg</code> namun tidak tertaut pada <em>library</em> lain seperti <code>libssl</code> atau <em>library</em> lain yang terus berubah (karena proses <em>upgrade</em> dan sebagainya), <em>library</em> yang dibutuhkan untuk <code>pkg-static</code> berkerja sudah tersedia di dalam binari-nya sendiri sehingga <code>pkg-static</code> tidak akan rusak dan selalu bisa dipakai. <code>pkg-static</code> dipergunakan untuk mem<em>build</em> <code>pkg</code> itu sendiri (<code>bootstrap pkg</code>). Namun untuk penggunaan sehari - hari <code>pkg</code> lebih diutamakan karena aplikasi ini terus di<em>update</em> dan <em>upgrade</em>.</p><p>Secara fitur, <code>pkg-static</code> memiliki fitur yang identik dengan <code>pkg</code>. Namun ada fungsi utama yang sering dipakai yaitu <code>bootstrap</code> untuk meng<em>generate</em> ulang aplikasi <code>pkg</code>.</p><ol><li><em>Bootstrap</em> <code>pkg</code></li></ol><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg-static bootstrap -y</span></span>
</code></pre><p><code>pkg-static</code> akan mem<em>build</em> ulang <code>pkg</code>, sebaiknya dilanjut dengan <code>update</code> repo setelah selesai.</p><ol start="2"><li><em>Database corrupt</em></li></ol><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg-static update -f</span></span>
</code></pre><p><code>pkg-static</code> akan mengunduh data secara paksa dan membuat <em>database</em> baru.</p><hr><h2 id="mempergunakan-port%E2%80%99s" tabindex="-1">Mempergunakan Port’s <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mempergunakan-port%E2%80%99s">#</a></h2><p>Port’s adalah kumpulan dari beberapa <em>files</em> <code>Makefile</code>, <code>patches</code>, dan <code>Description</code> yang dipergunakan untuk mem-<em>build</em> sebuah <em>package</em>. Sehingga untuk mendapatkan sebuah <em>binary</em> yang siap untuk di<em>install</em> perlu melakukan <em>build</em> yang sering kali membutuhkan sumber daya komputasi lebih.</p><h3 id="mempersiapkan-port%E2%80%99s" tabindex="-1">Mempersiapkan Port’s <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#mempersiapkan-port%E2%80%99s">#</a></h3><div class="postnotes"><p>Ane pakai Port's untuk mencari <i>package</i> yang lebih cepat <i>up to date</i> dibandingkan dari repo <code>pkg</code> resmi. Namun sebaiknya dihindari kalo tidak butuh banget karena prosesnya lebih ribet, makan waktu dan <i>resources</i> perangkat.</p></div><p><em>Files</em> <code>Makefile</code> dan kawan - kawannya terlebih dahulu harus disalin ke lokal dan kemudian baru bisa melakukan <code>build</code>. Karena repo dari Port’s ini disimpan dalam repo <code>git</code> maka perlu untuk memasang <em>package</em> <code>git</code> terlebih dahulu. Asumsi bahwa Port’s sama sekali masih kosong, maka <em>install</em> <code>git</code> dengan <code>pkg</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install git-lite</span></span>
</code></pre><aside>Bisa juga memasang <code>git</code>, namun karena cuma butuh operasi <code>git</code> standar maka ane pasang <code>git-lite</code> yang lebih ringan.</aside><p>Kemudian mulai untuk menyalin (<code>clone</code>) repositori Port’s, simpan di <code>/usr/ports</code> dan lakukan <em>checkout</em>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas git -C /usr/ports pull</span></span>
</code></pre><aside><code>--depth 1</code> opsi ini untuk menyalin isi repo tanpa <i>commit history</i> sehingga ukurannya menjadi lebih ramping dan proses menjadi cepat.<br><p></p> Perintah di atas akan menyalin isi repo dengan rilis <code>latest</code>, sedangkan untuk <code>quarterly</code> harus menjalankan dengan opsi <em>branch</em><code>-b 2026Q1</code> yang berarti ambil dari <em>branch</em> kuartal 1 tahun 2026.<br><p></p> Sehingga perintah lengkapnya menjadi seperti ini <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas git clone --depth 1 https://git.FreeBSD.org/ports.git -b 2026Q1 /usr/ports</span></span>
</code></pre></aside><h3 id="memasang-aplikasi-dari-port%E2%80%99s" tabindex="-1">Memasang aplikasi dari Port’s <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#memasang-aplikasi-dari-port%E2%80%99s">#</a></h3><p>Repotnya di Port’s adalah saat mencari dimana letak dari folder aplikasi yang dimaksud, karena di dalam <code>/usr/ports</code> sendiri setidaknya ada 70 kategori dengan total 46195 <em>folders</em> di bawahnya!!!. Ane biasanya gunakan FreshPorts untuk mencari letak <em>folder</em> yang sesuai. Sebagai contoh ane akan pasang <code>vim</code>. Jika <a href="https://www.freshports.org/editors/vim/">merujuk pada FreshPorts</a> letak <code>vim</code> ada di <code>/usr/ports/editors/vim</code>. Maka cara <em>install</em>-nya seperti ini</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd /usr/ports/editors/vim</span></span>
<span class="token output">==&gt;  License VIM accepted by the user
===&gt;   vim-9.2.0204 depends on file: /usr/local/sbin/pkg - found
=&gt; vim-vim-v9.2.0204_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles.
=&gt; Attempting to fetch https://codeload.github.com/vim/vim/tar.gz/v9.2.0204?dummy=/vim-vim-v9.2.0204_GH0.tar.gz
vim-vim-v9.2.0204_GH0.tar.gz                            18 MB 7562 kBps    03s
===&gt; Fetching all distfiles required by vim-9.2.0204 for building
===&gt;  Extracting for vim-9.2.0204
=&gt; SHA256 Checksum OK for vim-vim-v9.2.0204_GH0.tar.gz.
install  -m 0644 /usr/ports/editors/vim/files/vietnamese_viscii.vim /usr/ports/editors/vim/work-console/vim-9.2.0204/runtime/keymap
===&gt;  Patching for vim-9.2.0204
===&gt;  Applying FreeBSD patches for vim-9.2.0204 from /usr/ports/editors/vim/files

===&gt;   vim-9.2.0204 depends on package: libiconv&gt;=1.14_11 - found
===&gt;   vim-9.2.0204 depends on package: pkgconf&gt;=1.3.0_1 - found
===&gt;   vim-9.2.0204 depends on file: /usr/local/bin/python3.11 - found

===&gt;  Installing for vim-9.2.0204

/usr/local/bin/vim
</span></code></pre><p>Untuk menghemat spasi karena dalam proses <code>build</code> Ports akan mengunduh banyak sekali <em>dependecies</em> maka gunakan opsi <code>clean</code>. Bisa sebelum atau sesudah proses <code>build</code>.</p><h3 id="menghapus-package-dari-ports" tabindex="-1">Menghapus <em>package</em> dari Ports <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#menghapus-package-dari-ports">#</a></h3><p>Untuk menghapus ada 2 cara, bisa pakai perintah <code>pkg delete</code> karena toh juga <em>package</em> namanya meski dipasang dari Ports dan bisa pakai perintah <code>make deinstall</code>. Untuk perintah yang kedua ini harus masuk kembali ke <em>folder</em> <em>package</em> tersebut terlebih dahulu. Jadi gunakan saja <code>pkg delete</code> karena lebih mudah.</p><h3 id="meng-upgrade-ports" tabindex="-1">Meng-<em>upgrade</em> Ports <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#meng-upgrade-ports">#</a></h3><p>Caranya ribet, pokoknya pakai Ports itu ribet!. Pertama harus tau dulu daftar dari <em>package</em> yang ada versi pembaharuan namun harus melakukan <code>git pull</code> terlebih dahulu untuk memperbarui <code>local copy</code> dari repo Ports.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas git -C pull /usr/ports</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg version -l "&lt;"</span></span>
</code></pre><p>Akan meng<em>update</em> dan menampilkan <em>package</em> yang ada versi pembaharuan dan kemudian (secara manual) melakukan <code>build</code> ulang satu per satu. Kalo cuma ada 2 atau 3 <em>packages</em> yang perlu di<em>upgrade</em> maka ga terlalu masalah, namun kalo ada 10-an ke atas <em>packages</em> itu baru masalah. Maka ada yang namanya <a href="https://cgit.freebsd.org/ports/tree/ports-mgmt/portmaster/">Portmaster</a> sebuah alat kecil yang berjasa untuk melakukan <em>upgrade</em> atas Ports yang terpasang. <em>Install</em> dulu dengan</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd /usr/ports/ports-mgmt/portmaster</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas make install clean</span></span>
</code></pre><p>Setelah sukses, tinggal pakai cara ini untuk menampilkan daftar yang perlu di<em>ugrade</em></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas portmaster -L</span></span>
<span class="token output">...
...
===&gt;&gt;&gt; 176 total installed ports
    ===&gt;&gt;&gt; 1 has a new version available

</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas portmaster -a</span></span>
<span class="token output">...
</span></code></pre><p>Selain untuk melakukan <em>upgrade</em> sebenarnya <code>portmaster</code> bisa juga dipakai untuk meng-<em>install</em> Ports. Caranya adalah dengan perintah <code>$ doas portmaster editors/vim</code> dan ini jauh lebih mudah daripada cara manual.</p><h2 id="kesimpulan" tabindex="-1">Kesimpulan <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-serba-serbi-pkg/#kesimpulan">#</a></h2><p>FreeBSD memberikan alat untuk melakukan pencarian, pemasangan, <em>upgrade</em>, maupun menghapus sebuah atau lebih aplikasi yang bernama <code>pkg</code>. <em>Package Manager</em> ini sangat <em>powerfull</em> untuk melakukan tugasnya secara umum dan jauh lebih mudah daripada memakai <em>ports</em> karena akan meng<em>install</em> aplikasi dari <em>pre-built binaries</em> yang sudah tersedia.</p><p>Meski disebut tidak memiliki <em>wrapper</em> untuk <code>pkg</code> namun <code>portmaster</code> juga bisa dipakai untuk manajemen <em>package</em>. Ada juga <a href="https://man.freebsd.org/cgi/man.cgi?poudriere">Poudriere</a> yang bisa dipakai meski fungsi utamanya untuk melakukan <em>package builder</em> dan <em>port tester</em>. Berbeda dengan <em>wrapper package manager</em> lainnya seperti Powerpill di Arch Linux, di FreeBSD tidak memberikan fitur <em>download accelerator</em> namun lebih pada kekuatan di pengelolaan <em>dependencies</em> dan keamanan.</p><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/freebsd">#freebsd</a></h4><div class="related_post_list"><span class="related_post_date">14 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-blocklist/"> <h4>Blocklistd: cara ampuh menghalau penyusup di FreeBSD</h4></a><p class="post_ringkasan">pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.</p></div><div class="related_post_list"><span class="related_post_date">04 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/"> <h4>Self host Ente Photos di FreeBSD</h4></a><p class="post_ringkasan">Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula</p></div><div class="related_post_list"><span class="related_post_date">21 Des 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-backup-restic/"> <h4>Backup data dengan Restic dan Rclone</h4></a><p class="post_ringkasan">Sedia backup sebelum hujan badai datang</p></div><div class="related_post_list"><span class="related_post_date">14 Nov 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-self-hosting-s3/"> <h4>Self hosting S3 di FreeBSD dengan Garage</h4></a><p class="post_ringkasan">Memasang garage sebagai peladen S3 di FreeBSD</p></div><div class="related_post_list"><span class="related_post_date">26 Des 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/jika-lupa-password-root-freebsd/"> <h4>Jika lupa password root FreeBSD</h4></a><p class="post_ringkasan">Cara ini sering dipakai untuk merubah password root jika kelupaan</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KNCEENCJD01EE7BP2MHJRNNA">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KNCEENCJD01EE7BP2MHJRNNA"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Kuliner Nasi Tongkol Mbak Ju di Wonokromo</title>
      <link>https://kusaeni.com/jurnal/kuliner-nasi-tongkol-mbak-ju/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/kuliner-nasi-tongkol-mbak-ju/</guid>
      <content:encoded>
        <![CDATA[<p>Bermula menonton VT (Video Toktok) ane melihat review tentang makanan “penyetan” yang (sejak dulu sebenarnya sudah) viral dan lejen di Surabaya. Ketika ada kesempatan ke Kota Pahlawan ini ane luangkan waktu untuk mencoba.</p><p>Nama warungnya adalah Nasi Tongkol Mbak Ju yang berlokasi di dalam pasar DTC (Darmo Trace Center) di daerah Wonokromo Surabaya. Jika sempat menengok ke Toktok atau Youtube, maka bakal banyak video yang muncul me<em>review</em> dan menjelaskan tentang warung ini. Seperti namanya warung ini berjualan nasi dengan lauk ikan tongkol. Hanya ini saja menunya namun yang beli ramai pula.</p><p>Dari sekian banyak video yang sudah ane tonton, ada 1 kesimpulan bahwa nasi tongkol ini enak banget namun 1 hal yang hilang yaitu rute ke lokasi. Apa pasal? Warung ini terletak di dalam pasar modern dengan total 6 lantai. Banyak orang hanya memuji - muji saja rasa menunya tanpa menunjukkan arah dan rute yang tepat dan cepat untuk menuju warung ini.</p><h2 id="menuju-lokasi" tabindex="-1">Menuju Lokasi <a class="header-anchor" href="https://kusaeni.com/jurnal/kuliner-nasi-tongkol-mbak-ju/#menuju-lokasi">#</a></h2><p>Berbekal niat saja ane putuskan untuk mencoba mencari dimana letak warung ini. Dari terminal bus Bungurasih, ane naik Gojek. Harapannya adalah abang gojek akan membantu menjawab pertanyaan saya namun ternyata zonk. Si abang lebih paham tentang <em>skincare</em> pelindung dari sengatan matahari daripada lokasinya. Jadi diputuskan ikut dengan petunjuk dari Google Maps (sambil berdo’a semoga tak salah arah).</p><p>Tentu saja apa yang bisa diharapkan dari Google Map kalo lokasinya di dalam pasar?</p><p>Si abang Gojek nurunin ane di kampung sebelah pasar karena Google Map menyebut disitu tempat terdekatnya. Lokasinya dekat dengan Warung Mak Yeye yang terkenal itu (tutup kalo siang).</p><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d611.6525280494121!2d112.73799932435037!3d-7.3014294044492365!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x2dd7fb7ee97ae2a9%3A0xe53e5b4dd8de3445!2sSambel%20Tongkol%20Mbak%20Ju!5e0!3m2!1sen!2sid!4v1737195876940!5m2!1sen!2sid" allowfullscreen="" class="peta" height="500" loading="lazy" style="border:0" width="750"></iframe><p>Alhasil ane harus muter - muter dulu untuk masuk ke DTCnya. Setelah capek muter - muter, ane akhirnya bisa masuk DTC lewat jalur jalan parkir mobil dan langsung mengarah ke Lantai 1. Di dalam pasar Google Map ini cupu, tidak bisa menunjukkan arah yang tepat. Ane seperti sedang di dalam lorong - lorong labirin dengan tumpukan daster dan celana jeans KW yang bertebaran di kanan kiri. Semakin ke dalam semakin sepi penjualnya, hanya ada deretan stand kosong dan tertutup.</p><p>Disini istilah “malu bertanya sesat di jalan” sepertinya sangat relevan. <em>Bye Google you’re useless</em>. Akhirnya ane lewat depan orang jualan <em>skincare</em>, <em>what</em>!!!. Ane langsung saja ditarik sama mbak - mbak SPG untuk ditawarin produknya, si mbak sales nyerocos terus ga bisa distop. Ane lirik ternyata sudah agak sepuh. Kasian, akhirnya ane beli produknya meski ga butuh. Tapi di sisi yang lain ane mau manfaatkan untuk bertanya lokasi warung nasi ini.</p><p>Setelah bertanya ternyata memang berada di lantai 1 dan ada di pojokan belakang. Berbekal informasi ini ane jalan - jalan muter - muter lagi sampai akhirnya ketemu lokasi yang dimaksud. Alhamdulillah.</p><p>Namun setelah makan ternyata ada rute yang gampang dan mudah menuju warung ini, yaitu masuk ke DTC lewat pintu di Jalan Wonokromo (jangan di Jalan Stasiun Wonokromo maupun Jalan Jagir Wonokromo). <span class="sans"><strong>GAMBAR 1</strong></span>.</p><div class="gallery gal-2-baris" id="glightbox"><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9526%20Large_ztJZsMsOb.jpeg" style="grid-column:1/-1"> <img alt="DTC Jl Wonokromo" class="fuck radius-atas" src="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9526%20Large_ztJZsMsOb.jpeg"> </a><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9525%20Large_tvPdIzunw.jpeg"> <img alt="DTC Parkir Sepeda Motor" class="fuck radius-kiri-bawah" src="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9525%20Large_tvPdIzunw.jpeg"> </a><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9523%20Large_FYTpUuwQ7.jpeg"> <img alt="DTC Tangga ke Lantai 1" class="fuck radius-kanan-bawah" src="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9523%20Large_FYTpUuwQ7.jpeg"> </a></div><p class="ncaption">Rute paling mudah untuk menuju Warung Mbak Ju</p><p>Kemudian pilih gang menuju lokasi parkir sepeda motor, jalan lurus <span class="sans"><strong>GAMBAR 2</strong></span> sampai ketemu tangga, naik, dan kemudian belok ke kiri. <span class="sans"><strong>GAMBAR 3</strong></span>. Setelah 1 atau 2 gang, Warung Nasi Tongkol Mbak Ju berada di sebelah kananmu.</p><h2 id="nasi-tongkol" tabindex="-1">Nasi Tongkol <a class="header-anchor" href="https://kusaeni.com/jurnal/kuliner-nasi-tongkol-mbak-ju/#nasi-tongkol">#</a></h2><p>Ane sampai di warung sekitar jam 11 lebih 20 menit, saat itu sudah ada beberapa pembeli yang datang belum ramai sekali. Kata orang nanti ramainya pas jam makan siang.</p><div class="gallery gal-2-baris" id="glightbox"><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9518%20Large_2RO5WbD3G.jpeg" style="grid-column:1/-1"> <img alt="Warung Nasi Tongkol Mbak Ju" class="fuck radius-atas" src="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9518%20Large_2RO5WbD3G.jpeg"> </a><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9514%20Large_-tymnNeS9.jpeg" style="grid-column:1/-1"> <img alt="Anak alm Mbak Ju sedang melayani pelanggan" class="fuck radius-bawah" src="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9514%20Large_-tymnNeS9.jpeg"> </a></div><p class="ncaption">Area sekitaran warung, sempit, tempat duduk terbatas dan agak kotor. Maklum di dalam pasar. Anak alm. Mbak Ju sedang meracik sepiring nasi tongkol</p><p>Tak menunggu lama ane langsung pesan saja nasi tongkol dengan tambah lauk telor dadar. Si penjual adalah anak dari Mbak Ju (sudah meninggal) kerjanya cepat. Beliau kemudian menyiapkan sambal tomat - terasi dan menguleknya langsung di tempat, segera 1 porsi nasi tongkol langsung tersedia lengkap dengan telor dadar dan sambal lalapan. Selain itu dikasih juga teri goreng dan sambal yang terbuat dari tongkol yang dihaluskan.</p><img class="fuck radius-atas" alt="Nasi" src="https://ik.imagekit.io/hjse9uhdjqd/Bear/IMG_9517%20Large_enVS-PHtP.jpeg"><p class="ncaption">Sepiring nasi tongkol mbak Ju</p><p><strong>The moment of the truth</strong>.</p><p>Ngomongin <em>influencer</em> kuliner di Indonesia, ane tidak pernah percaya kecuali dengan rekomendasi (alm) Bondan Winarno. Kalo beliau bilang enak maka sudah pasti enak. Maknyus!!! 👌🏽</p><p>Sedangkan yang lain ane masih ragu. Termasuk untuk rekomendasi nasi tongkol ini yang setelah ane coba rasa sambalnya biasa saja. Terasinya kurang terasa, menurut ane lebih enak <a href="https://kusaeni.com/jurnal/perjalanan-ke-timur-mencari-nasi-tempong/">sambal tempong di Banyuwangi</a>. Namun ada yang unik di sambal tongkolnya, ane sama sekali belum pernah makan sambal seperti ini. Menarik. Rasa ikan teri goreng ya sama seperti ikan teri lainnya, <em>crispy</em> dan <em>salty</em>. Menurut ane malah rasa teri ini yang memberikan “rasa” pada masakan ini karena telor dadarnya pun tidak ada rasa apapun.</p><p>Tapi tentu saja ane tetap habiskan dengan penuh semangat karena belum makan sejak pagi. Selain itu yang membuat ane sedikit kecewa adalah ketika diberi pilihan sambal ane sudah sampaikan minta sambal yang pedas tapi ternyata pedasnya sama sekali tak terasa. Ane ingin merasakan sambal terasi yang pedas menggelora, biar berkeringat dan lendir di hidung keluar. Apakah mungkin si penjual lupa?</p><p><em>Review</em> rasa ini subyektif ane, bisa saja orang lain akan berpendapat berbeda. Tapi yang pasti ane datang ke warung saat sedang flu dan batuk. Bisa jadi flu ini mengurangi kerja alat perasa ane. Ya mungkin seperti itu. Oleh karena itu ane ada rencana akan mampir saat ada keperluan di Surabaya lagi.</p><h3 id="update" tabindex="-1">Update <a class="header-anchor" href="https://kusaeni.com/jurnal/kuliner-nasi-tongkol-mbak-ju/#update">#</a></h3><p>Beberapa pekan yang lalu ane sempatkan datang lagi kesini saat ada kesempatan ke Surabaya. Seperti biasa datang saat akhir pekan dan pas tengah hari. Saat itu pengunjung penuh sekali dan ane harus mengantri. Tidak lama karena pelayanan memang cepat.</p><div class="gallery gal-1-baris" id="glightbox"><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/jurnal/nasi_tongkol/IMG_3973_aBh7Y2kTl.jpeg"> <img alt="antri di Warung Tongkol Mbak Ju" class="fuck radius-kiri-atas radius-kiri-bawah" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/nasi_tongkol/IMG_3973_aBh7Y2kTl.jpeg"> </a><a data-gallery="gallery" href="https://ik.imagekit.io/hjse9uhdjqd/jurnal/nasi_tongkol/IMG_3976_dwB08jekS.jpeg"> <img alt="Sepiring nasi tongkol Mbak Ju" class="fuck radius-kanan-atas radius-kanan-bawah" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/nasi_tongkol/IMG_3976_dwB08jekS.jpeg"> </a></div><p class="ncaption">Suasana ramai di Warung Mbak Ju. Sepiring nasi tongkol Mbak Ju.</p><p>Ane pesan menu yang sama seperti sebelumnya namun dengan pesan tegas kalo ane minta sambel yang pedas. Akhirnya setelah mendapatkan sepiring nasi tongkol ane kemudian mencari tempat duduk. Sangat ramai tapi untungnya pas ane sudah dapat makanan ada sepasang insan manusia bergeser untuk keluar sehingga ane dapat tempat (meski sempit dan seadanya).</p><p>Ternyata kekhawatiran ane terbalas, rasanya sama dengan saat ane datang sebelumnya. Bukan karena ane pilek, melainkan memang rasanya kurang menurut ane. Oke sambelnya pedas namun rasa terasi kurang terasa, tongkolnya pun bukan yang <em>salty</em> melainkan biasa saja. Telur dadarnya pun seakan tidak dibumbui apa - apa. Namun begitu ane tetap habiskan menu ini dan pesan 1 bungkus lagi untuk dibawa pulang.</p><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/kuliner">#kuliner</a></h4><div class="related_post_list"><span class="related_post_date">12 Jul 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/kuliner-kepala-manyung/"> <h4>Kuliner kepala Manyung</h4></a><p class="post_ringkasan">Berikut adalah daftar destinasi kuliner masakan kepala manyung yang pernah ane coba.</p></div><div class="related_post_list"><span class="related_post_date">29 Jan 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/perjalanan-ke-timur-mencari-nasi-tempong/"> <h4>Perjalanan ke Timur mencari Nasi Tempong</h4></a><p class="post_ringkasan">Ekspedisi menuju ke Timur untuk membuktikan kelezatan nasi tempong khas Banyuwangi di daerah asalnya.</p></div><div class="related_post_list"><span class="related_post_date">15 Jun 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/berburu-soto-di-solo/"> <h4>Berburu Soto di Solo</h4></a><p class="post_ringkasan">Saya adalah pecinta soto. Sudah banyak soto yang sudah dicoba, mulai dari soto <em>à la</em> daerah Mataraman, Soto Lamongan, Soto Madura, Soto Kudus, Soto Betawi, Soto Banjar, Coto Makasar, dan Soto Blitar (Bok Ireng), dan Soto Seger.</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KHDZVX3N00XJ2EFG663DQQKN">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KHDZVX3N00XJ2EFG663DQQKN"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Murder at The Black Cat Café</title>
      <link>https://kusaeni.com/baca/murder-at-black-cat-cafe/</link>
      <guid isPermaLink="false">https://kusaeni.com/baca/murder-at-black-cat-cafe/</guid>
      <content:encoded>
        <![CDATA[<div class="selayang"><div class="selayang__cover"><img alt="Murder at The Black Cat Café" class="layang" src="https://ik.imagekit.io/hjse9uhdjqd/buku/seishi%20yokomizo%20-%20murder%20at%20black%20cat%20cafe_js9f-vDmD.jpeg"></div><div class="selayang__meta"><dl><dt>Penulis</dt><dd>Seishi Yokomizo</dd><dt>Bahasa</dt><dd>Bahasa Inggris</dd><dt>Format</dt><dd>epub</dd><dt>ISBN</dt><dd>9781805335511∷ 2025</dd><dt>Rating</dt><dd><a href="https://kusaeni.com/baca/rating">3 dari 5</a></dd><dt>Beli dimana?</dt><dd><a href="https://pushkinpress.com/book/murder-at-the-black-cat-cafe/" target="_blank">Pushkinpress</a></dd></dl></div></div><p>Ini adalah buku/novel yang sangat ane antisipasi terbitnya ketika petang baru beranjak datang di pertengahan bulan Juli. Namun informasi yang beredar novel ini baru tersedia di akhir tahun. Ketika gegap gempita orang - orang membuat kaleidoskop yang berisi tentang sesosok plonga plongo yang sekarang meminang sebagian kekuasaan, akhirnya ane mendapatkan versi <em>e-book</em> dari buku ini.</p><h3 id="the-black-cat-caf%C3%A9" tabindex="-1">The Black Cat Café <a class="header-anchor" href="https://kusaeni.com/baca/murder-at-black-cat-cafe/#the-black-cat-caf%C3%A9">#</a></h3><p>Di sebuah malam yang tenang di kota Tokyo yang mulai berbenah setelah kehancuran di Perang Dunia II, seorang anggota polisi berpatroli di daerah yang bernama Pink Labyrinth. Daerah ini cukup sepi karena berada di sisi perbukitan yang di atasnya ada kuil, ada pemakaman yang berada di bawah kuil, dan area luas dengan sebuah kafe di ujung jalan. Kafe itu dikenal dengan nama Kafe Kucing Hitam karena di dalamnya ada seekor kucing hitam yang menjadi maskot peliharaan pemilik kafe. Seperti umumnya kafe di Tokyo saat itu, di Kafe Kucing Hitam juga menyediakan “kucing” yang bisa elus dan menemani untuk sekedar minum - minum.</p><p>Namun saat itu Kafe Kucing Hitam sudah tutup karena pemilik sebelumnya − yaitu Daigo dan Oshige Itojima − sudah menjualnya kepada orang lain dan sekarang sedang dalam proses renovasi. Namun tidak ada pekerja di sekitar situ karena sedang libur.</p><p>Si Polisi berjalan melewati depan Kafe dan mendengar suara aneh seperti orang sedang menggali tanah di tanah lapang di belakang Kafe. Penasaran, si Pak Pol kemudian menyelidikinya dan menemukan seseorang sedang menggali tumpukan tanah di belakang Kafe, dia adalah seorang biksu muda bernama Nitcho yang merupakan biksu di kuil Renge-in di atas bukit. Nitcho berteriak histeris melihat apa yang ditemukannya, ternyata di dalam lubang galian terdapat jasad perempuan dengan wajah hancur dan tidak bisa dikenali lagi.</p><p>Distrik kecil itu langsung heboh, para detektif dikerahkan untuk melakukan penyelidikan. Yokomizo sendiri ditahuan dan dimintai keterangan, katanya kepada petugas kalo dia bermimpi bertemu seorang perempuan di dekat situ dan terus kepikiran sehingga kemudian turun dan memeriksa. Dia melihat ada semacam gundukan tanah yang sepertinya masih baru dan melihat ada sedikit bagian tangan yang tersembul di permukaan dan kemudian mulai menggali. Menurut keterangan para saksi, dari bentuk tubuh korban mirip dengan bentuk tubuh istri dari pemilik kafe. Namun si Pak Pol membantah karena sempat melihat dan menyapa pasangan suami istri itu saat hendak pergi setelah menutup kafe, meski tidak bisa melihat jelas wajah istri pemilik kafe karena tersembunyi di bawah kerudung.</p><p>Setelah melakukan penyelidikan, polisi menemukan beberapa fakta sebagai berikut</p><ol><li>Suami istri tersebut adalah warga Jepang yang kabur kembali dari Manchuria (Cina) setelah perang, namun mereka tidak kembali bersama - sama melainkan Oshige (istri) pulang terlebih dahulu baru setelah beberapa bulan sang suami menyusul,</li><li>Selama tinggal di Tokyo, Oshige berkerja di kabaret dan kemudian menjadi simpanan seorang pengusaha konstruksi yang juga bekas bos Yakuza,</li><li>Daigo (suami) kemudian datang ke Tokyo, dia datang bersama dengan seorang perempuan kenalan yang merupakan pasangannya selama tidak bertemu istrinya. Jadi baik Daigo dan Oshige sama - sama berselingkuh,</li><li>Setelah saling bertemu, Daigo memutuskan hubungan dengan perempuan kenalannya itu dan kemudian membeli sebuah kafe dan diberi nama Black Cat Café,</li><li>Meski begitu Oshige masih sering menemui bos konstruksi dan masih berhubungan/berselingkuh,</li><li>Daigo tahu ini tapi tidak berdaya dan kemudian dia juga mulai kembali berselingkuh dengan perempuan kenalannya itu,</li><li>Oshige marah, pasangan ini jadi sering bertengkar. Oshige curhat kepada pegawainya dan mengungkapkan betapa bencinya dia dengan perempuan selingkuhan Daigo. Mereka kemudian menjual kafe dan berencana pergi ke kota lain dan memperbaiki hubungan keluarga kembali,</li><li>Sebelum kafe terjual, Oshige sakit karena alergi kulit parah akibat salah memakai <em>make up</em>. Dia tidak terlihat selama beberapa hari, bahkan oleh para pekerja di kafenya. Menurut Daigo, Oshige bersembunyi karena malu,</li><li>Pekerja di kafe menemukan kucing maskotnya makin lama makin kurus dan menemukan beberapa bercak darah di pintu shoji (pintu geser kertas) yang menurut Daigo adalah darah si kucing yang menggila,</li><li>Kafe dijual, pekerja dipecat, dan kemudian suami istri Daigo Oshige keluar dan pindah ke kota lain,</li><li>Ditemukan mayat perempuan di belakang kafe yang fisiknya mirip Oshige,</li><li>Ditemukan mayat kucing hitam,</li></ol><p>Pertanyaanya adalah jasad siapakah itu? siapa yang membunuhnya? lalu apa hubungan Daigo dan Oshige dengan Yakuza?</p><h3 id="catatan" tabindex="-1">Catatan <a class="header-anchor" href="https://kusaeni.com/baca/murder-at-black-cat-cafe/#catatan">#</a></h3><p>Meski judulnya Murder at Black Cat Café, buku ini ternyata terdiri dari 2 cerita yang tidak saling berkaitan sehingga bisa dibilang ini adalah novel pendek.</p><p>Ane tak pernah meragukan kualitas cerita misteri karya Seishi Yokomizo, beliau adalah salah satu penulis hebat dari Jepang dengan karakter fiksinya Kosuke Kindaichi yang masih sangat populer dari dulu sampai sekarang. Sentuhan khasnya dalam membuat karakter yang kuat, trik pembunuhan ruang tertutup, dan plot yang sering kali tragis menjadi semacam standar emas dalam kesusastraan novel misteri di Jepang (bahkan dunia).</p><p>Pertama membaca bukunya yang berjudul <a href="https://kusaeni.com/baca/the-inugami-curse/">The Inugami Curse</a> ane sudah kagum dengan penulisannya, bukunya adalah literatur klasik. Dibuat antara tahun 1946 - 1975 membuat ane harus menurunkan ekspektasi dan berusaha menyelam di era itu yang metode dan alat penyelidikan belum secanggih sekarang. Tapi ternyata ekspektasi rendah ane tidak berbuah manis karena isi bukanya adalah kumpulan <em>masterpieces</em>, sejak saat itu Yokomizo adalah penulis favorit ane.</p><div class="relasi m-auto"><img class="relaimg" src="https://ik.imagekit.io/hjse9uhdjqd/tr:n-cover/buku/TheInugamiCurses_aLfIHO09R.jpeg"><div class="relasi_meta"><div class="juduldkk"><h4><a class="hRelasi" href="https://kusaeni.com/baca/the-inugami-curse">The Inugami Curses</a></h4><p class="author">Seishi Yokomizo</p></div><p>Kutukan yang menimpa keluarga Inugami, saat waris dibacakan, satu persatu akan mati</p></div></div><p>Namun untuk buku ini ada sehelai sembilu di hati, bukan tentang kualitas Seishi melainkan betapa pendeknya cerita Murder at The Black Café, hanya ada 9 bab saja (11 dengan prolog dan epilog) bandingkan dengan The Inugami Curses yang terdiri dari 35 bab!. Begitu juga dengan porsi kemunculan Detektif Kindaichi yang kesannya cuma sebentar saja. Ini mengingatkan kekecewaan ane juga pada buku <a href="https://kusaeni.com/baca/murder-at-black-cat-cafe/baca/murderinthecrookedhouse/">Murder in The Crooked House</a> karya Soji Shimada yang memiliki pola serupa.</p><div class="relasi m-auto"><img class="relaimg" src="https://ik.imagekit.io/hjse9uhdjqd/tr:n-cover/buku/murder_crocked_house_-KeZxKoOZ.jpg"><div class="relasi_meta"><div class="juduldkk"><h4><a class="hRelasi" href="https://kusaeni.com/baca/murder-in-the-crooked-house">Murder in The Croocked House</a></h4><p class="author">Soji Shimada</p></div><p>Pembunuhan di Rumah Miring. Kasus ruang tertutup yang nyaris sempurna</p></div></div><p>Meski begitu ane tetap menikmati karya Seishi satu ini (dan satu lagi cerita yang belum selesai ane baca di buku yang sama (8 bab)). Namun menurut ane tokoh penjahatnya cukup mudah ditebak. Ya mungkin karena sudah banyak buku atau film dengan plot yang serupa.</p><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KFSVH6N5GKG5C57195VWH4Y2">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KFSVH6N5GKG5C57195VWH4Y2"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Blocklistd: cara ampuh menghalau penyusup di FreeBSD</title>
      <link>https://kusaeni.com/jurnal/freebsd-blocklist/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/freebsd-blocklist/</guid>
      <content:encoded>
        <![CDATA[<nav class="toc"><h4>Daftar Isi</h4><ol><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#blocklistd">Blocklistd</a> <ul><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#ssh">SSH</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#ftp">FTP</a></li></ul></li><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#ssh-guard">SSH Guard</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#cara-lainnya-(paling-mudah)">Cara lainnya (paling mudah)</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#pilih-yang-mana%3F">Pilih yang mana?</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-blocklist/#pengamanan-ssh-lanjutan">Pengamanan SSH lanjutan</a></li></ol></nav><img alt="sekelompok zombie berusaha menyerang rumah dengan pintu kayu bertuliskan SSH di atasnya, seorang penjaga berpenampilan seperti asterix sedang menjaga dengan 2 tameng" class="fuck lebar" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/blocklist/gemini_sshguard_8jt-eEZ11.png"><p>Semua yang online pasti beresiko atas perentasan, meski bilangnya sistem paling kuat tapi <em>assume everything will be attacked</em> atau <em>no system is safe</em>. Teknik awal dalam perentasan adalah melakukan <em>scanning ports</em> dan kemudian mengeksploitasinya, yang paling sering diincar adalah port SSH dan FTP. Meskipun banyak sekali teknik dalam perentasan, namun paling tidak mengamankan <em>ports</em> ini adalah langkah awal yang baik.</p><h3 id="blocklistd" tabindex="-1">Blocklistd <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#blocklistd">#</a></h3><p>Blacklistd (sekarang sudah dirubah menjadi Blocklistd) adalah salah satu fitur di FreeBSD yang berguna untuk membuka atau menutup sebuah port dengan kriteria tertentu. Apalagi jika masih mempergunakan port standar untuk SSH yaitu di <em>port</em> <code>22</code>. Saat selesai <em>install</em> FreeBSD (di VPS), tak lama kemudian akan bermunculan para hiu mencoba <em>bruteforce</em> akses SSH, dengan pelbagai macam cara dimana IP yang sering sekali mencoba berasal dari Asia. Maka Blocklistd ini sangat berguna untuk menghalau dan memblokir alamat IP tersebut untuk mengakses SSH. Secara fungsi mirip dengan <a href="https://www.fail2ban.org/">fail2ban</a> yaitu memblokir alamat IP yang gagal <em>login</em> SSH dengan rentang waktu tertentu.</p><div class="postnotes"><p>Perubahan nama dari Blacklistd ke Blocklistd ini mengikuti dari perubahan yang dilakukan oleh NetBSD. FreeBSD mengimpor fungsi ini dari NetBSD, sehingga saat nama berubah maka FreeBSD mengikuti untuk menjaga kompatibilitas. Meski begitu ada kabar menyebutkan bahwa perubahan ini untuk menghindari kesan rasis kepada sekelompok komunitas.</p><p>Beberapa istilah yang dirubah di antaranya:</p><ul><li><b>Blacklistd</b> (daftar hitam) menjadi <b>Blocklistd</b> (daftar cekal)</li><li><b>Whitelist</b> (daftar putih) menjadi <b>Allowlist</b> (daftar diijinkan)</li></ul><p>Meskipun begitu sampai dengan rilis 15.0, FreeBSD masih mempertahankan perintah <code>blacklistctl</code> di sistemnya dan bisa dipakai dengan baik</p></div><p>Blocklistd sudah ada di dalam FreeBSD, tidak perlu memasangnya lagi, dan tinggal mengaktifkan saja.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc blocklistd_enable="YES"</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc blocklistd_flags="-r"</span></span>
</code></pre><aside><i>flags</i><code>-r</code> untuk membuat <i>rules</i> blocklist tetap tersedia setelah reboot.</aside><p>ini akan mengaktifkan Blocklistd dan akan tersedia setiap sistem dimulai ulang, untuk sistem yang sudah berjalan tinggal perintahkan untuk <code>start</code></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service blocklistd start</span></span>
</code></pre><h4 id="ssh" tabindex="-1">SSH <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#ssh">#</a></h4><p>Khusus untuk memonitor SSH, maka rubah konfigurasi SSH untuk mengaktifkan Blocklistd.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc sshd_flags="-o UseBlocklistd=yes"</span></span>
</code></pre><p>atau langsung rubah file konfigurasi <code>sshd_config.conf</code> dan <em>uncomment</em> baris <code>UseBlacklistd yes</code> (jika masih <code>no</code> tinggal ganti ke <code>yes</code>). Setelah merubah konfigurasi atau menambahkan baris di <code>/etc/rc.conf</code>, layanan SSH harus di <em>restart</em>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service sshd restart</span></span>
</code></pre><p>Di FreeBSD semua hal yang berkaitan dengan akses jaringan, maka PF pasti akan ikutan bermain. Maka rubah konfigurasi PF untuk mengaktifkan Blocklistd.</p><pre class="language-txt" tabindex="0"><code class="language-txt">table &lt;blocklistd&gt; persist
anchor "blacklistd/*" in on $ext_if

block in quick from &lt;blocklistd&gt;
</code></pre><aside><ul><li>rubah <code>$ext_if</code> dengan nama <i>interface</i> yang bisa dicek dengan <code>ifconfig</code></li><li>baris <code>block in quick from <blocklistd></blocklistd></code> ini berguna untuk memblok IP yang terjaring oleh Blocklistd, tapi ini opsional</li></ul></aside><p>Untuk menentukan waktu tunggu sampai sebuah IP bisa kembali mengakses SSH, maka perlu merubah konfigurasi Blocklistd.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas ee /usr/local/etc/blocklistd.conf</span></span>
<span class="token output">location      type    proto   owner   name    nfail   duration
vtnet:ssh        *       *       *       *       3       72h
</span></code></pre><p>dimana perintah ini akan membuat Blocklistd memonitor <em>port</em> SSH di <em>interface</em> <code>vtnet</code>, jika sebuah IP gagal login 3 kali, maka IP tersebut akan diblokir selama 72 jam. Pengaturan 72 jam ini bisa saja diubah sesuai keinginan, <code>2400h</code> untuk 100 hari, namun perhatikan juga bahwa semakin lama waktu tunggu maka <mark>semakin banyak IP yang tercatat dan bisa saja memenuhin <em>table</em> PF sehingga membutuhkan sumber daya lebih untuk memprosesnya</mark>.</p><div class="postnotes pink"><p>Setiap perubahan file konfigurasi harus diikuti dengan <i>restart service</i> yang konfigurasinya diubah agar perubahan bisa diterapkan.</p></div><p>Tapi bagaimana jika ini menjadi pedang bermata dua saat kita sendiri gagal <em>login</em> ke SSH? Maka caranya adalah menghapus IP kita dari <em>table</em> <code>blocklistd</code> dengan perintah berikut.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -a "blocklistd/22" -t port22 -T delete &lt;IP&gt;</span></span>
</code></pre><aside>💡 Gunakan akses (web)VNC atau konsol untuk bisa mengeksekusi perintah ini karena <i>user</i> tidak bisa masuk melalui SSH.</aside><p>Ini akan menghapus IP kita dari PF sehingga kita bisa kembali mengakses SSH, namun masih akan muncul di dalam table <code>blocklistd</code> dan akan dihapus saat masa tunggu <em>expired</em>. Lalu bagaimana cara melihat IP apa saja yang terjaring oleh Blocklistd? Ada perintah khusus untuk itu.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas blocklistctl dump -abr</span></span>
<span class="token output">rulename                address/ma:port id      nfail   remaining time
blocklistd       143.198.161.12/32:22   OK      3/3     5h29m32s
blocklistd          54.38.52.18/32:22   OK      3/3     8h51m11s
blocklistd         46.151.182.7/32:22           1/3     10h16m37s
blocklistd       103.105.176.66/32:22   OK      3/3     17h39m40s
blocklistd          161.35.92.3/32:22           1/3     5h31m23s
blocklistd        45.78.193.199/32:22   OK      3/3     6h10m2s
blocklistd       209.15.115.240/32:22   OK      3/3     11h12m9s
blocklistd        153.99.94.233/32:22           1/3     11h13m45s
blocklistd       122.55.205.229/32:22   OK      3/3     13h39m36s
</span></code></pre><aside>tanda <code>OK</code> menandakan bahwa IP tersebut sudah terblok. Sedangkan yang tidak ada menandakan IP tersebut sudah ditandai namun belum masuk ke dalam <i>table</i> blocklist.</aside><p>Untuk melihat data IP dengan PF, gunakan perintah seperti ini</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">pfctl -a blacklistd/22 -t port22 -T show</span></span>
<span class="token output">143.198.161.12
54.38.52.18
46.151.182.7
103.105.176.66
</span></code></pre><h4 id="ftp" tabindex="-1">FTP <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#ftp">#</a></h4><p>Pada dasarnya Blocklistd akan memblok <em>port’s</em> yang sudah diatur di <code>/etc/blocklistd.conf</code> salah satunya FTP. Jika memakai FTP sebagai koneksi ke <em>server</em>, maka bentuk pengamanannya adalah dengan menambahkan <em>flags</em> <code>-B</code> setelah <em>command</em> FTP.</p><p>Pengaturannya bisa di <code>/etc/inetd.conf</code> atau langsung di <code>/etc/rc.conf</code>. Berikut cara mengaturnya di <code>rc.conf</code></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc ftpd_flags="-B"</span></span>
</code></pre><h3 id="ssh-guard" tabindex="-1">SSH Guard <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#ssh-guard">#</a></h3><p>Selain Blocklist, FreeBSD juga memiliki SSH Guard untuk melindungi <em>port</em> SSH dari serangan, khususnya metode <em>brute-force attack</em>. SSH Guard akan mengumpulkan data dari <em>system log</em> dan memblokir IP pelaku pelanggaran berulang mempergunakan kemampuan dari <em>firewall</em>. Tidak seperti Blocklist, SSH Guard bisa melakukan pemblokiran secara permanen atau sementara waktu saja.</p><p>SSH Guard bisa dipasangkan dengan PF, <a href="https://en.wikipedia.org/wiki/Ipfirewall">IPFW</a>, <a href="https://firewalld.org/">firewalld</a>, maupun IPtables (<a href="https://www.netfilter.org/projects/nftables/index.html">nftables</a>) sebagai <code>backend</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install sshguard</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc sshguard_enable="YES"</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /usr/local/etc/sshguard.conf</span></span>
</code></pre><p>sebelum mengaktifkan SSH Guard, perlu melakukan <a href="https://manned.org/man/arch/sshguard-setup.7">sshguard-setup</a>, yaitu dengan mengubah <em>file</em> <code>/usr/local/etc/sshguard.conf</code>. Beberapa hal yang perlu ane sesuaikan, karena pakai PF maka ane <em>uncomment</em> baris <code>BACKEND</code>.</p><pre class="language-txt" tabindex="0"><code class="language-txt">BACKEND="/usr/local/libexec/sshg-fw-pf"
</code></pre><p>Selain itu agar IP ane tidak diblokir maka ane perlu <em>uncomment</em> juga baris <code>WHITELIST</code>.</p><pre class="language-txt" tabindex="0"><code class="language-txt">WHITELIST_FILE=/usr/local/etc/sshguard.whitelist
</code></pre><p>Kemudian bikin file <code>/usr/local/etc/sshguard.whitelist</code> dengan isian IP yang hendak diijinkan. Masalahnya adalah ane tidak punya IP publik (CG NAT), maka ane masukkan IP yang bisa dicek di situs seperti <a href="https://whatismyipaddress.com/">WhatIsMyIPAddress</a>. Misalkan hasilnya <code>100.99.98.97</code> maka ane masukkan subnetnya <code>100.99.98.0/24</code>. Yang dimasukkan cukup IP saja, 1 baris 1 IP.</p><p>Untuk pengaturan PF, maka perlu ditambahkan baris berikut di <code>/etc/pf.conf</code></p><pre class="language-ini" tabindex="0"><code class="language-ini">table &lt;sshguard&gt; persist
block in proto tcp from &lt;sshguard&gt;
</code></pre><p>Kemudian <code>restart</code> PF dan jalankan SSH Guard,</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -nf /etc/pf.conf</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -f /etc/pf.conf</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service sshguard start</span></span>
</code></pre><p>Contoh hasil penjaringan oleh SSH Guard:</p><pre class="language-log" tabindex="0"><code class="language-log">Jan 14 20:27:54 oyenBSD sshd-session[56374]: Invalid user admin from 103.23.199.119 port 44768
Jan 14 20:27:54 oyenBSD sshguard[56323]: Attack from "103.23.199.119" on service SSH with danger 10.
Jan 14 20:27:55 oyenBSD sshd-session[56374]: Received disconnect from 103.23.199.119 port 44768:11: Bye Bye [preauth]
Jan 14 20:28:06 oyenBSD sshd-session[56376]: Received disconnect from 188.37.194.181 port 46948:11: Bye Bye [preauth]
Jan 14 20:28:12 oyenBSD sshd-session[56378]: Invalid user ubuntu from 45.78.204.234 port 49542
Jan 14 20:28:12 oyenBSD sshguard[56323]: Attack from "45.78.204.234" on service SSH with danger 10.
Jan 14 20:28:13 oyenBSD sshd-session[56378]: Received disconnect from 45.78.204.234 port 49542:11: Bye Bye [preauth]
</code></pre><p>Untuk melihat daftar IP yang diblokir SSH Guard, bisa menggunakan perintah berikut:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -t sshguard -T show</span></span>
<span class="token output">103.23.199.119
</span></code></pre><aside>kalo isi table sshguard kosong, berarti belum ada IP yang terjaring. Biasanya dalam perjalanan waktu akan muncul IP yang tertangkap oleh SSH Guard.</aside><h3 id="cara-lainnya-(paling-mudah)" tabindex="-1">Cara lainnya (paling mudah) <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#cara-lainnya-(paling-mudah)">#</a></h3><p>Daripada ribet dan repot mengatur Blocklist dan atau SSH Guard, ada cara atau trik khusus yang sering ane pakai dan selalu berjalan lancar yaitu merubah <em>port</em> SSH ke <em>custom port</em> acak lainnya. Kenapa? karena bot lebih banyak <em>scrapping</em> dan <em>brute force</em> pada <em>port</em> standar.</p><p><em>Default</em>nya <em>port</em> SSH adalah <code>22</code>, jadi ane akan rubah misalnya menjadi <code>2277</code>. Maka ane perlu merubah <code>pf.conf</code> dan <code>sshd_config</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas ee /etc/pf.conf</span></span>
<span class="token output">pass in quick inet proto tcp from any to any port 2277 flags S/SA keep state
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas ee /etc/ssh/sshd_config</span></span>
<span class="token output">Port 2277
</span></code></pre><p>kemudian <em>restart</em> SSH dan PF</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service sshd restart</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service pf restart</span></span>
</code></pre><p>Aman? mungkin. Tapi bisa saja akan ketahuan saat bot melakukan <em>scan</em> terhadap semua port. Pengalaman ane, dari 100x <em>bot</em> tertangkap ada 1 atau 2 <em>bot</em> yang berusaha terhubung ke <em>custom port</em> ini.</p><h3 id="pilih-yang-mana%3F" tabindex="-1">Pilih yang mana? <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#pilih-yang-mana%3F">#</a></h3><p>Jika kamu pengguna NetBSD maka Blocklist sudah ada di dalam sistem dan sudah jalan dengan baik, sedangkan kalo pakai FreeBSD harus mengaktifkannya secara manual. SSH Guard bukanlah aplikasi <em>native</em> di dalam sistem, perlu memasangnya dulu tapi kelebihannya tersedia untuk pelbagai OS (di luar BSD). Selain itu SSH Guard juga punya kelebihan untuk monitor banyak <em>ports</em>, jadi jika di sistem punya banyak <em>service</em> yang perlu dimonitor SSH Guard cocok sekali dipakai. Namun jika cuma port SSH atau FTP, maka Blocklist sudah lebih dari cukup.</p><p>Mengganti <em>port</em> SSH dengan <em>custom port</em> mungkin terlihat aman untuk waktu tertentu, tapi <em>bot</em> semakin hari semakin canggih sehingga bisa saja nantinya akan meng-<em>scan port</em> lain dan tinggal tunggu waktu untuk ketemu. Jadi tetap memasang Blocklist adalah pilihan yag bijaksana, apalagi Blocklist ringan dan tidak memakan <em>resources</em> yang tinggi.</p><h3 id="pengamanan-ssh-lanjutan" tabindex="-1">Pengamanan SSH lanjutan <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-blocklist/#pengamanan-ssh-lanjutan">#</a></h3><p>Meskipun sudah memasang Blocklist atau SSH Guard, akan lebih baik lagi jika akses ke SSH diamankan lebih kuat lagi. Beberapa cara yang umum dan disarankan adalah tidak memberikan akses untuk <em>login</em> ke SSH dengan <em>password</em> melainkan dengan <code>SSH Pubkey ID</code> dan tidak memberikan ijin <em>user</em> <code>root</code> untuk <em>login</em> dengan SSH.</p><ol><li><b>Login dengan SSH Public Key</b></li><ul><li>Buat <i>public key</i>, katakanlah hendak membuat <i>public key</i> khusus untuk akses ke SSH</li></ul><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">ssh-keygen -t ed25519 -C "ssh-FreeBSD"</span></span>
</code></pre><p>ikuti semua <i>prompt</i> yang muncul sampai selesai. Setelah selesai seharusnya <i>file public key</i> sudah tersedia di <code>~/.ssh/id_ed25519.pub</code></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cat ~/.ssh/id_ed25519.pub</span></span>
</code></pre><p>akan muncul baris teks kode acak dengan awalan <code>SSH-ed25519</code></p><ul><li>Salin file <code>id_ed25519.pub</code> ke VPS</li></ul><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">ssh-copy-id -i ~/.ssh/id_ed25519.pub poes@oyenBSD</span></span>
</code></pre><p>ikuti <i>prompt</i> dan proses yang muncul seperti minta <i>password login</i> ke SSH.</p></ol><div class="postnotes"><p class="sans"><b>Menyimpan kredensial di keychain atau Bitwarden</b></p><p>Cara ini adalah dengan memanfaatkan <i>keychain</i> dari aplikasi Password Manager pihak ketiga seperti Apple Password, Bitarden, atau 1Password. Aplikasi ini akan membantu proses <i>login</i> dan secara otomatis akan memasukkan password SSH saat <i>login</i>. Tentu untuk tambahan keamanan bisa pakai biometrik untuk <i>approval</i>.</p><p>Sebagai contoh ane pakai Bitwarden, caranya mudah saja. Setelah selesai membuat SSH <i>public key</i>, salin isi dari <i>file</i> <code>id_ed25519.pub</code></p><pre class="language-none" tabindex="0"><code class="language-none">
    $ cat ~/.ssh/id_ed25519
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDSbxBaKblxIjY+ugSUoE51/bd
    OMp2mo7f4S+11PQvSeKqzrgtHFmbccA5fabkRWXv0mEGEscHm/dDNpapZCAJEdM4
    WPsfeqxv+dZvcPI++L+kkIJU9VdvYlmpUWyXX1+RMqOOSlflv8S6dLHiakgpGNqq
    O7YxmjM3ucnqHKobjQIDAQAB
    -----END PUBLIC KEY-----
    </code></pre><p>Kemudian buka aplikasi Bitwarden, dan tambahkan <i>entry</i> baru dengan kategori <b>SSH Key</b>. Otomatis Bitwarden akan membuat sebuah <i>entry</i> SSH Key sekaligus mengisi datanya. Tapi tentu saja data tersebut tidak sesuai dengan yang ane inginkan, jadi ane akan rubah dengan cara beri nama SSH Key tersebut dan simpan. Kemudian langsung pilih <b>Edit</b> atau klik pada ikon pensil, pada kelompok <b>SSH Key</b> kolom <b>Private Key</b> pilih ikon kertas dan pensil dengan keterangan <b>Import Key from Clipboard</b> dan simpan.</p><p class="kuning-gading">Sebagai catatan Bitwarden saat ini hanya support <code>ed25519</code> saja</p><p>Terakhir, tuju ke pengaturan Bitwarden dan aktifkan (kasih centang) pada <b>Enable SSH Agent</b> untuk mengaktifkan koneksi ke terminal. Setelah ini setiap terminal menjalankan perintah SSH, maka Bitwarden akan menunjukkan permintaan <i>approval</i>, bisa dengan biometrik ataupun memasukkan <i>password</i> dari Bitwarden.</p><p>Informasi lebih lengkap bisa dibaca di halaman <a href="https://bitwarden.com/help/ssh-agent/#tab-macos-6VN1DmoAVFvm7ZWD95curS">dokumentasi Bitwarden</a></p></div><ol start="2"><li><p><strong>Menolak root login lewat SSH.</strong> Para penyerang biasanya akan memakai <em>username</em> <code>root</code> untuk melakukan serangan, jadi membatasi akses <code>root</code> untuk <em>login</em> ke SSH adalah pilihan yang tepat. Caranya adalah dengan mengubah konfigurasi <code>sshd_config</code>.</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /etc/ssh/sshd_config</span></span>
<span class="token output">---
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication no
---
</span></code></pre> <p>Di <code>sshd_config.conf</code> cari baris konfigurasi di atas, hilangkan tanda <code>#</code> atau komentar, kemudian sesuaikan isinya seperti baris - baris di atas. Penjelasannya sebagai berikut:</p></li></ol><div class="ragu"><table><thead><tr><th style="text-align:left">Isi konfig</th><th style="text-align:left">Keterangan</th></tr></thead><tbody><tr><td style="text-align:left"><code>PermitRootLogin no</code></td><td style="text-align:left">Baris ini menonaktifkan akun <code>root</code> untuk akses SSH</td></tr><tr><td style="text-align:left"><code>PasswordAuthentication no</code></td><td style="text-align:left">Bikin SSH tidak pakai password tapi pakai cara lain</td></tr><tr><td style="text-align:left"><code>PubkeyAuthentication yes</code></td><td style="text-align:left">Cara lain yang dipakai yaitu pakai SSH public key</td></tr><tr><td style="text-align:left"><code>PermitEmptyPasswords no</code></td><td style="text-align:left">Password ga boleh kosong dong, ya kan?</td></tr><tr><td style="text-align:left"><code>KbdInteractiveAuthentication no</code></td><td style="text-align:left">Ga wajib, tapi sebaiknya diatur. Ane juga kurang paham</td></tr></tbody></table></div><p>Kemudian <em>restart</em> SSH dengan <code>$ doas service sshd restart</code> dan coba login ke SSH lagi. Seharusnya <em>prompt</em> yang muncul adalah <em>password</em> dari file <code>id_ed25519.pub</code> yang sebelumnya ane buat.</p><p><code>shell-session       ➜  ~ ssh poes@oyenBSD       Enter passphrase for key '/Users/poes/.ssh/id_ed25519':       </code></p><p>masukkan <em>password</em> yang dibuat sebelumnya.</p><ol start="3"><li><p><strong>Pakai <em>rate limit</em> untuk membatasi jumlah akses</strong>. Mengatur <em>rate limiting</em> akan membuat <em>firewall</em> mencegah serangan <em>brute force attack</em> dengan membatasi jumlah koneksi pada <em>port</em> SSH dalam kurun waktu tertentu. Untuk ini PF bisa meng<em>handle</em>nya dengan baik.</p> <p>Jika Blocklistd akan memblok akses jika dalam beberapa kali percobaan gagal login dengan sukses di SSH, maka PF akan memblok akses bahkan sebelum percobaan <em>login</em> terjadi. Maka rubah bagaimana PF mengatur akses ke SSH</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /etc/pf.conf</span></span>
<span class="token output">pass in on $ext_if proto tcp from any to any port 22 /
flags S/SA keep state (max-src-conn 10, max-src-conn-rate 5/60)
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -nf /etc/pf.conf</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -f /etc/pf.conf</span></span>
</code></pre> <aside><ul><li>perintah <code>pfctl -nf /etc/pf.conf</code> digunakan untuk mencoba apakah <i>rules</i> <code>pf.conf</code> ada masalah (salah syntax) atau tidak.</li><li>perintah <code>pfctl -f /etc/pf.conf</code> digunakan untuk meng<i>reload</i> <i>rules</i> tanpa me<i>restart service</i></li></ul></aside> <p>Perintah ini akan membuat PF memeriksa jumlah akses secara bersamaan dan mencoba akses ke SSH dengan maksimal 5 percobaan dalam semenit (60 detik). Jika percobaan (biasanya oleh <em>bot</em>) itu lebih dari 5 kali dalam semenit maka PF akan mengabaikan koneksi ini.</p> <p>Digabungkan dengan Blocklistd maka PF akan menolak akses dari IP yang mencoba akses lebih dari 5 kali dalam kurun satu menit, jika tidak maka akan muncul <em>prompt login</em> SSH. Jika gagal login sebanyak 3x karena salah <em>password</em>, maka Blocklistd akan memblokir aksesnya dalam jangka waktu yang sudah ditentukan (misalnya 100 hari).</p></li></ol><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/freebsd">#freebsd</a></h4><div class="related_post_list"><span class="related_post_date">14 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-blocklist/"> <h4>Blocklistd: cara ampuh menghalau penyusup di FreeBSD</h4></a><p class="post_ringkasan">pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.</p></div><div class="related_post_list"><span class="related_post_date">04 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/"> <h4>Self host Ente Photos di FreeBSD</h4></a><p class="post_ringkasan">Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula</p></div><div class="related_post_list"><span class="related_post_date">21 Des 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-backup-restic/"> <h4>Backup data dengan Restic dan Rclone</h4></a><p class="post_ringkasan">Sedia backup sebelum hujan badai datang</p></div><div class="related_post_list"><span class="related_post_date">14 Nov 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-self-hosting-s3/"> <h4>Self hosting S3 di FreeBSD dengan Garage</h4></a><p class="post_ringkasan">Memasang garage sebagai peladen S3 di FreeBSD</p></div><div class="related_post_list"><span class="related_post_date">26 Des 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/jika-lupa-password-root-freebsd/"> <h4>Jika lupa password root FreeBSD</h4></a><p class="post_ringkasan">Cara ini sering dipakai untuk merubah password root jika kelupaan</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KEYD0GSTPZ8YBBVAK3K8RCX6">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KEYD0GSTPZ8YBBVAK3K8RCX6"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Self host Ente Photos di FreeBSD</title>
      <link>https://kusaeni.com/jurnal/freebsd-ente-selfhost/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/freebsd-ente-selfhost/</guid>
      <content:encoded>
        <![CDATA[<nav class="toc"><h4>Daftar Isi</h4><ol><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#persiapan">Persiapan</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#build">Build</a> <ul><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#backend">Backend</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#frontend">Frontend</a></li></ul></li><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#caddy-reverse-proxy">Caddy Reverse Proxy</a> <ul><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#konfigurasi-lanjutan">Konfigurasi lanjutan</a></li><li><a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#linux">Linux</a></li></ul></li></ol></nav><p><img alt="Ente Photos app" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/ente/SCR-20260104-lauq_qWUOHgCosI.png"></p><p>Artikel ini berisi catatan ane saat memasang Ente di FreeBSD. Sejujurnya memasang Ente adalah proses <em>self host</em> app yang sangat rumit dan menjengkelkan yang pernah ane rasakan, hingga saat ini. Jadi tujuan catatan ini dibuat menjadi sangat jelas agar ane (atau ente atau elu) tidak menjadi pusing dan jengkel seperti ane sebelum ini.</p><p>Ente adalah aplikasi backup foto seperti Google Photos atau iCloud Photos, dia punya banyak fitur keren (dan <em>overkill</em> untuk ukuran aplikasi Photos) seperti <em>end to end encryption, open source, cross platform, face recognition, zero knowledge AI</em>, tanpa iklan, tanpa AI, tanpa <em>tracking</em>, dan bahkan 2FA <em>Authenticator</em> di dalamnya.</p><p>Ane akan fokus pada fungsi Ente untuk penyimpanan Photos, jadi berikut catatan yang sudah ane kumpulkan dari pengalaman memasang Ente (yang menjengkelkan itu). Ente sudah memberikan dokumentasi untuk <em>self host</em> tanpa Docker, per hari ini sudah banyak perbaikan atas dokumentasi ini namun 3 bulan yang lalu kacau isinya.</p><h3 id="persiapan" tabindex="-1">Persiapan <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#persiapan">#</a></h3><p>Ente sudah menyediakan <em>binary</em> yang bisa langsung dipasang, sayangnya tidak untuk FreeBSD. Oleh karena itu ane perlu mem-<em>build</em> sendiri <em>binary</em> tersebut. Untuk melakukan itu ada beberapa aplikasi dan pustaka yang perlu dipasang terlebih dahulu.</p><ol><li><p><strong>Go</strong>. Mutlak diperlukan karena Ente dibuat dengan Go, tambahkan <code>pkgconf</code> untuk <em>handling dependencies</em>. Ane nanti perlu <em>pull</em> data dari repo Ente di <a href="https://github.com/ente-io/ente/">Github</a> jadi butuh Git. Untuk <em>reverse proxy</em> ane akan pakai <a href="https://caddyserver.com/">Caddy</a>.</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg update</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install go124 pkgconf git-lite caddy</span></span>
</code></pre></li><li><p><strong>Postgresql</strong>. Ente pakai postgresql untuk database-nya, juga minta <code>libsodium</code> untuk enkripsi E2E. Karena ane sudah ada postgresql di jail yang lain, jadi ane cukup pasang <code>libsodium</code>. Tapi, oke baiklah mari kita anggap tidak ada postgres.</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install libsodium postgresql18-server</span></span>
</code></pre> <p>Kemudian buat database postgresql, sebelum itu aktifkan postgresql, inisialisasi postgres ,dan jalankan daemonnya dulu</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc postgresql_enable="YES"</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas /usr/local/etc/rc.d/postgresql initdb</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service postgresql start</span></span>
</code></pre> <p>Pastikan bahwa postgresql sudah berjalan dengan baik</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service postgresql status</span></span>
<span class="token output">status postgresql
pg_ctl: server is running (PID: 66771)
/usr/local/bin/postgres "-D" "/data/postgres/data18"

</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sockstat -4 | grep 5432</span></span>
<span class="token output">postgres postgres   88698  9 tcp4  10.0.0.3:5432         10.0.0.4:13701
postgres postgres   88682  9 tcp4  10.0.0.3:5432         10.0.0.4:62644
postgres postgres   88662  9 tcp4  10.0.0.3:5432         10.0.0.4:58171
postgres postgres   66771  6 tcp4  10.0.0.3:5432         *:*
</span></code></pre> <p>Setelah postgres benar - benar berjalan, ganti password untuk user default postgresql yaitu <code>postgres</code></p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas passwd postgres</span></span>
</code></pre> <p>Buat user dan database untuk Ente, kemudian atur agar database tersebut menjadi milik user yang dibuat.</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">su - postgres</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">CREATEUSER ente-admin</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">CREATEDB ente-db -O ente-admin</span></span>
</code></pre> <p>Atur password untuk <code>ente-admin</code> dan beri semua <em>privilleges</em> untuknya.</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">psql ente-db</span></span>
<span class="token output">ente-db=# ALTER ROLE ADMIN WITH ENCRYPTED PASSWORD 'entebahlul';
ente-db=# GRANT ALL PRIVILLEGES ON DATABASE ente-db TO ente-admin;
ente-db=# exit
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">exit</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service postgresql restart</span></span>
</code></pre> <p>Asumsi postgresql dan Ente akan berjalan di <code>localhost</code>, maka ane tidak perlu mengubah pengaturan untuk akses jaringan di <code>postgresql.conf</code> dan <code>pg_hba.conf</code>. Namun jika postgresql jalan di jaringan atau jail yang lain, maka perlu merubah pengaturan.</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">vim /data/db/postgres/data18/postgresql.conf</span></span>
<span class="token output">listen_addresses = '*'
</span></code></pre> <p>merubah isian <code>listen_addresses</code> ke <code>*</code> membuat postgresql akan menerima koneksi dari luar jail. Kemudian di file <code>pg_hba.conf</code> ditambahkan isian sebagai berikut</p> <pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">vim /data/db/postgres/data18/pg_hba.conf</span></span>
<span class="token output">	host    ente_db      all     10.0.0.3/32         trust
	host    ente_db      all     10.0.0.0/24         trust
</span></code></pre> <p>dimana <code>10.0.0.3</code> adalah IP dari Ente.</p></li><li><p><strong>NodeJS</strong>, diperlukan untuk <em>build frontend</em>. Sebenarnya ane ga butuh untuk <em>build frontend</em> di FreeBSD, namun siapa tahu ada masalah ane tetap <em>install</em> saja.</p></li></ol><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install node24 yarn-node24</span></span>
</code></pre><ol start="4"><li><strong>Storage</strong> alias penyimpanan. Ane sudah punya Garage S3 yang berjalan di dalam jail dan sudah menulis <a href="https://kusaeni.com/jurnal/freebsd-self-hosting-s3/">tentang cara pasang</a> dan pengaturannya.</li></ol><h3 id="build" tabindex="-1">Build <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#build">#</a></h3><p>Ente memiliki 2 jenis servis yaitu <em>backend</em> dan <em>frontend</em>, oleh karena itu perlu untuk melakukan build secara terpisah. <em>Backend</em>nya sendiri dibangun dengan Go dan akan menghasilkan <em>file binary</em>, sedangkan <em>frontend</em>nya dibangun dengan NextJS.</p><h4 id="backend" tabindex="-1">Backend <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#backend">#</a></h4><p>Setelah semua persiapan selesai, saatnya melakukan <em>build</em> Ente server. Unduh repo Ente terlebih dahulu dengan git dan kemudian <em>build</em>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">git clone https://github.com/ente-io/ente.git</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd ente/server</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">go124 mod tidy</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">go124 build cmd/museum/main.go</span></span>
</code></pre><aside>Di FreeBSD ada beberapa versi Go sehingga saat install harus menyebutkan secara spesifik versi Go yang diinginkan. Sehingga perintah Go di CLI akan diikuti oleh versinya seperti di atas maka perintah Go menjadi <code>go124</code><br><br> Agar bisa mempergunakan perintah <code>go</code> saja, maka cara paling mudah adalah membuat <code>alias</code> di <code>~/.profiles</code> seperti misalnya <code> alias go='go124'</code>.</aside><p></p><p>Perintah <code>go124 mod tidy</code> digunakan untuk mengunduh semua <em>dependencies</em> dan perintah <code>go124 build</code> untuk memulai melakukan <em>build</em> dengan hasil <em>file</em> <code>main</code> yang sudah memiliki atribut <em>execute</em>.</p><p>Saat <em>file</em> <code>main</code> dijalankan akan muncul error bahwa dia membutuhkan <em>file</em> konfigurasi bernama <code>museum.yaml</code>. Jadi salin <em>file</em> tersebut dari folder <code>example</code> atau bikin sendiri kosongan.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cp config/example.yaml ./museum.yaml</span></span>
</code></pre><p>Agar bisa berjalan saja untuk sementara ane isi dengan konfigurasi database dan bucket S3. Contohnya seperti ini</p><pre class="language-yaml" tabindex="0"><code class="language-yaml">db:
  host: 10.0.0.3
  port: 5432
  sslmode: disable
  name: ente-db
  user: ente-user
  password: entebahlul

s3:
  are_local_buckets: false
  use_path_style_urls: true
  b2-eu-cen:
    key: W3wNV6XRh1YJ8arQKBoongNqGhQ
    secret: FakeLIpA3l0VjttIiHaZgdMXF4ujQOYTyBtztpSy7w0yD2qzphOQwRtvj
    endpoint: s3.taa.ee
    region: us-east-1
    bucket: ente-bucket
</code></pre><p>khusus untuk s3, karena ane pakai local atau <em>selfhost</em> maka nilai <code>are_local_buckets: false</code> karena ane pakai <code>endpoint url</code>. Ane sudah coba kasih <code>true</code> tapi tak pernah bisa tersambung dengan baik. <code>b2-eu-cen</code> adalah <code>key</code> yang harus dipakai jika pakai s3 <em>selfhost</em> atau AWS Compatible s3.</p><p>Kemudian jalankan <mark> <code>./main</code> secara <code>default</code>nya akan mencari <em>file</em> <code>museum.yaml</code> sebagai konfigurasi utama </mark> atau kasih <em>flags</em> <code>--config path</code> jika memakai nama yang lain. Ente akan berjalan di <code>http://localhost:8080</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">cd ente/server</span></span>
<span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">./main --config /root/ente/server/museum.yaml</span></span>
</code></pre><div class="postnotes kuning-gading"><h4>Update</h4><p>Agar Ente bisa dijalankan setiap <i>boot</i> maka bisa dibuat <i>service script</i> seperti contoh berikut.</p><pre class="language-bash" tabindex="0"><code class="language-bash"><span class="token shebang important">#!/bin/sh</span>
 <span class="token comment"># PROVIDE: ente</span>
 <span class="token comment"># REQUIRE: networking postgresql</span>
 <span class="token comment"># KEYWORD: shutdown</span>
 <span class="token builtin class-name">.</span> /etc/rc.subr
 
 <span class="token assign-left variable">name</span><span class="token operator">=</span><span class="token string">"ente"</span>
 <span class="token assign-left variable">rcvar</span><span class="token operator">=</span><span class="token string">"ente_enable"</span>
 <span class="token assign-left variable">desc</span><span class="token operator">=</span><span class="token string">"Ente Photos Server"</span>
 
 <span class="token assign-left variable">ente_dir</span><span class="token operator">=</span><span class="token string">"/root/ente/server"</span>
 <span class="token assign-left variable">ente_bin</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${ente_dir}</span>/main"</span>
 <span class="token assign-left variable">ente_config</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${ente_dir}</span>/museum.yaml"</span>
 <span class="token assign-left variable">ente_log</span><span class="token operator">=</span><span class="token string">"/var/log/ente.log"</span>
 <span class="token assign-left variable">ente_pid</span><span class="token operator">=</span><span class="token string">"/var/run/ente.pid"</span>
 
 load_rc_config <span class="token variable">$name</span>
 <span class="token builtin class-name">:</span> <span class="token variable">${ente_enable<span class="token operator">:=</span>NO}</span>
 
 <span class="token assign-left variable">command</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${ente_bin}</span>"</span>
 <span class="token assign-left variable">command_args</span><span class="token operator">=</span><span class="token string">"--config <span class="token variable">${ente_config}</span>"</span>
 <span class="token assign-left variable">start_cmd</span><span class="token operator">=</span><span class="token string">"ente_start"</span>
 <span class="token assign-left variable">stop_cmd</span><span class="token operator">=</span><span class="token string">"ente_stop"</span>
 <span class="token assign-left variable">status_cmd</span><span class="token operator">=</span><span class="token string">"ente_status"</span>
 
 <span class="token function-name function">ente_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
     <span class="token builtin class-name">echo</span> <span class="token string">"Starting <span class="token variable">${name}</span>..."</span>
     <span class="token comment"># PAKSA CWD = folder ente</span>
     <span class="token builtin class-name">cd</span> <span class="token string">"<span class="token variable">${ente_dir}</span>"</span> <span class="token operator">||</span> <span class="token punctuation">{</span> <span class="token builtin class-name">echo</span> <span class="token string">"Failed to cd to <span class="token variable">${ente_dir}</span>"</span><span class="token punctuation">;</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
     <span class="token function">nohup</span> <span class="token variable">${command}</span> <span class="token variable">${command_args}</span> <span class="token operator">&gt;</span> <span class="token variable">${ente_log}</span> <span class="token operator"><span class="token file-descriptor important">2</span>&gt;</span><span class="token file-descriptor important">&amp;1</span> <span class="token operator">&amp;</span>
     <span class="token builtin class-name">echo</span> <span class="token variable">$!</span> <span class="token operator">&gt;</span> <span class="token variable">${ente_pid}</span>
     <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${name}</span> started (PID: <span class="token variable">$!</span>)"</span>
 <span class="token punctuation">}</span>
 <span class="token function-name function">ente_stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
     <span class="token builtin class-name">echo</span> <span class="token string">"Stopping <span class="token variable">${name}</span>..."</span>
     <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-f</span> <span class="token string">"<span class="token variable">${ente_pid}</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span>
         <span class="token function">kill</span> <span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> $<span class="token punctuation">{</span>ente_pid<span class="token punctuation">}</span><span class="token variable">)</span></span> <span class="token operator"><span class="token file-descriptor important">2</span>&gt;</span>/dev/null <span class="token operator">&amp;&amp;</span> <span class="token function">rm</span> <span class="token parameter variable">-f</span> <span class="token variable">${ente_pid}</span>
         <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${name}</span> stopped."</span>
     <span class="token keyword">fi</span>
 <span class="token punctuation">}</span>
 <span class="token function-name function">ente_status</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
     <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-f</span> <span class="token string">"<span class="token variable">${ente_pid}</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span>
         <span class="token assign-left variable">pid</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> $<span class="token punctuation">{</span>ente_pid<span class="token punctuation">}</span><span class="token variable">)</span></span>
         <span class="token keyword">if</span> <span class="token function">kill</span> <span class="token parameter variable">-0</span> <span class="token variable">$pid</span> <span class="token operator"><span class="token file-descriptor important">2</span>&gt;</span>/dev/null<span class="token punctuation">;</span> <span class="token keyword">then</span>
             <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${name}</span> is running (PID: <span class="token variable">$pid</span>)"</span>
         <span class="token keyword">else</span>
             <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${name}</span> not running (stale PID)"</span>
         <span class="token keyword">fi</span>
     <span class="token keyword">else</span>
         <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">${name}</span> is not running."</span>
     <span class="token keyword">fi</span>
 <span class="token punctuation">}</span>
 run_rc_command <span class="token string">"<span class="token variable">$1</span>"</span>
 </code></pre><p>Kemudian simpan sebagai <code>/usr/local/etc/rc.d/ente</code>, jangan lupa ganti atribut supaya bisa dijalankan sebagai <i>shell script</i></p><p></p><p><code>
     # chmod +x /usr/local/etc/rc.d/ente
   </code></p><p>Kemudian rubah <i>file</i> <code>/etc/rc.conf</code> dan masukkan pengaturan berikut</p><p><code>ente_enable=YES</code></p><p>Ente sekarang bisa dikelola dengan <code>service ente start|stop|restart</code> dan bisa jalan saat <i>boot</i></p></div><p>Jika ada rencana untuk memakai email sebagai alat komunikasi dan verifikasi, ada baiknya untuk mengatur JWT (JSON Web Token) yang bisa dibuat dengan perintah</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd ente/server</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">go124 run tools/gen-random-keys/main.go</span></span>
</code></pre><p>Kemudian simpan hasilnya di <em>file</em> <code>museum.yaml</code> di bawah pengaturan sebelumnya. Karena ane hanya <em>single user</em> maka ane tak perlu pengaturan ini, resikonya adalah OTP tidak akan dikirim ke email, melainkan harus melihat di console. (Lihat contoh <a href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#:~:text=maka%20verifikasi%20akun%20tidak%20bisa%20dilakukan%20melalui%20email.%20Jadi%20kembali%20ke%20console%20dan%20lihat%20log%20dari%20main%20dan%20cari%20baris%20seperti%20ini">dibawah</a>)</p><p>Setelah <em>backend</em> sudah selesai di<em>build</em> selanjutnya adalah <em>build</em> <code>ente-cli</code> yang nantinya sangat penting untuk melakukan <em>tweaks</em> akun Ente.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd ente/cli</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">go124 build -o "bin/ente-cli" main.go</span></span>
</code></pre><p>perintah ini akan menghasilkan file <code>ente-cli</code> di dalam folder <code>bin</code>. Agar bisa dipergunakan yang harus dilakukan adalah menentukan konfigurasi, <code>ente-cli</code> membutuhkan file <code>config.yaml</code> di folder <code>.ente</code> di <em>home directory</em>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd ~</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">mkdir .ente</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">touch config.yaml</span></span>
<span class="token output">endpoint:
	api: http://localhost:8080
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">mkdir secrets</span></span>
</code></pre><p>elu bisa pakai nilai <code>http://localhost:8080</code> atau langsung domain (tapi harus set di Caddy dulu). Juga harus membuat folder <code>secrets</code> yang dipergunakan <code>ente-cli</code> untuk menyimpan <em>secrets auth</em>.</p><p>Untuk sementara sampai disini <em>build backend</em> (server dan cli), selanjutnya adalah <em>build frontend</em>.</p><h4 id="frontend" tabindex="-1">Frontend <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#frontend">#</a></h4><p>Ane tidak melakukan <em>build frontend</em> di FreeBSD karena NextJS tidak bisa berjalan lancar di sini, memang bisa diakali dengan mengikuti banyak sekali <em>build library</em> dari <em>source</em> tapi tidak <em>worth it</em> untuk dilakukan. NextJS adalah aplikasi web dan dia tidak butuh harus di<em>build</em> di FreeBSD (<em>framework agnostic</em>), jadi ane akan build di Macos karena lebih mudah.</p><p>Di Macos tentu harus pasang Node, npm, dan <a href="https://yarnpkg.com/">yarn</a> semua diselesaikan oleh <a href="https://brew.sh/">Homebrew</a>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">git clone https://github.com/ente-io/ente.git</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd ente/web</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">yarn install</span></span>
</code></pre><p>Tunggu sampai selesai, setelah itu ane bisa saja mengatur <em>environment variables</em> tapi tidak ane lakukan karena memang mau buat Ente Photos lebih aman dengan mengetik langsung <em>endpoint</em>-nya saat login.</p><p><em>Frontend</em> bisa di<em>build</em> dengan yarn (ane hanya build <code>accounts</code>, <code>photos</code> saja ga butuh yang lainnya) caranya sebagai berikut</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">yarn build</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">yarn build:accounts</span></span>
</code></pre><p>kedua perintah di atas akan mem<em>build frontends</em> dan hasilnya bisa dilihat di folder <code>out</code> di bawah <code>apps/photos/</code> dan <code>apps/accounts/</code> . Untuk mempermudah maka ane kumpulkan folder <code>out</code> tadi ke satu folder khusus dengan nama <code>ente-www</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cp -R ente/web/apps/photos/out ~/ente-www/photos</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cp -R ente/web/apps/accounts/out ~/ente-www/accounts</span></span>
</code></pre><h3 id="caddy-reverse-proxy" tabindex="-1">Caddy Reverse Proxy <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#caddy-reverse-proxy">#</a></h3><p>Untuk ini ane sudah siapkan domain, sebut saja <code>photos.taa.ee</code>. Langsung saja <em>edit file</em> konfigurasi Caddy dan tambahkan <em>rules</em> baru.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /usr/local/etc/caddy/Caddyfile</span></span>
<span class="token output">photos.taa.ee {
	root * /home/tae/ente-www/photos
	file_server try_files {path} {path}.html /index.html
	}

ente.taa.ee {
	reverse_proxy http://127.0.0.1:8080
	}

</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas caddy validate /usr/local/etc/caddy/Caddyfile</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas service caddy restart</span></span>
</code></pre><p>Jika tidak ada masalah seharusnya Ente sudah bisa diakses dengan membuka <code>photos.taa.ee</code>. Di tampilan awal Ente, klik 7x di gambar brankas dan ketik alamat dari ente server yaitu <code>ente.taa.ee</code>. Kemudian klik pada tautan <strong>Don’t have an account</strong> untuk mendaftar.</p><p><img alt="ente developer mode" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/ente/ente-1_6vBhiSSZ8.gif"></p><p>Karena ane tidak setup email (SMTP dll termasuk JWT), maka verifikasi akun tidak bisa dilakukan melalui email. Jadi kembali ke console dan lihat log dari <code>main</code> dan cari baris seperti ini</p><pre class="language-text" tabindex="0"><code class="language-text">Skipping sending email to poes@taa.ee: Verification code: 946197
</code></pre><p>Masukkan kode verifikasi <code>946197</code> dan <em>voila</em> bisa langsung masuk ke dalam Ente Photos.</p><h4 id="konfigurasi-lanjutan" tabindex="-1">Konfigurasi lanjutan <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#konfigurasi-lanjutan">#</a></h4><p>Semua perubahan di <code>museum.yaml</code> harus diikuti dengan <em>restart</em> <code>main</code> agar Ente mempergunakan konfigurasi yang baru dirubah.</p><ol><li><strong>Closed, tidak menerima pendaftaran</strong>. Instance Ente ini ane pergunakan pribadi sehingga ane tidak perlu menerima pendaftaran, oleh karena itu ane masukkan <code>key</code> berikut di <code>museum.yaml</code></li></ol><pre class="language-yaml" tabindex="0"><code class="language-yaml">internal:
	disable-registration: true
</code></pre><p></p><ol start="2"><li><strong>Jadi Admin</strong>. Ini penting karena menjadi admin bisa melakukan pengaturan secara maksimal. Untuk menjadi admin ada beberapa langkah yang harus dilakukan yaitu mencari <code>user_id</code> di dalam database postgres dan masukkan ke dalam <code>museum.yaml</code>.</li></ol><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">psql -U ente-user -d ente-db</span></span>
<span class="token output">ente-db=# SELECT * FROM users;
</span></code></pre><p>Catat <code>user_id</code>, misalnya <code>1580567352375231</code> kemudian edit file <code>museum.yaml</code></p><pre class="language-yaml" tabindex="0"><code class="language-yaml">internal:
	disable-registration: true
	admins:
		- 1580567352375231
</code></pre><p></p><ol start="3"><li><strong>Upgrade storage</strong>. Meski <em>selfhost</em>, <em>default</em>nya Ente akan memberikan <em>storage</em> maksimal 10GB pada setiap user, agar bisa memaksimalkan <em>storage</em> ada 2 cara yaitu <em>edit</em> database atau pakai <code>ente-cli</code>.</li></ol><p>Agar bisa mempergunakan <code>ente-cli</code> maka akun ane harus sudah menjadi admin. Kemudian jalankan <code>ente-cli</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd ente/cli/bin</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">./ente-cli admin update-subscription -u poes@taa.ee --no-limit True</span></span>
</code></pre><p>perintah ini akan membuat user <a href="mailto:poes@taa.ee">poes@taa.ee</a> akan memiliki <em>storage</em> sebesar 100TB yang akan <em>expired</em> di 100 tahun kemudian.</p><p>Namun jika lebih nyaman dengan SQL, bisa dicoba <a href="https://pegelinux.top/users/kimiamania/statuses/115458916631493259">cara berikut:</a></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">psql -U ente-user -d ente-db</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">UPDATE subscriptions SET storage = 107374182400 WHERE user_id = 1580567352375231;</span></span>
</code></pre><p>Mempergunakan cara ini lebih beresiko database rusak sehingga ane pilih memakai <code>ente-cli</code>.</p><div class="image-2column"><div class="img1"><img alt="ente user limit storage" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/ente/ente-limit_vVmbYvovP.png"><p class="ncaption">Sebelum</p></div><div class="img2"><img alt="ente user no limit storage" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/ente/ente-no-limit_301ZKOOdo.png"><p class="ncaption">Sesudah</p></div></div><ol start="4"><li><p><strong>Update CORS</strong>. Ane pakai Garage S3 (AWS Compatible), entah mengapa selalu gagal saat upload media melalui Ente. Dari web console errornya adalah masalah CORS Origin. Jadi ane perlu benerin bucket dengan mengupdate CORS. Buat file dengan nama misalnya <code>cors.json</code></p> <pre class="language-json" tabindex="0"><code class="language-json">{
  "CORSRules": [
    {
      "AllowedOrigins": ["*"],
      "AllowedHeaders": ["*"],
      "AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
      "MaxAgeSeconds": 3000,
      "ExposeHeaders": ["Etag"]
    }
  ]
}
</code></pre></li></ol><p>Kemudian dengan <a href="https://github.com/aws/aws-cli">aws-cli</a> <em>update bucket policy</em>.</p><div class="postnotes kuning-gading"><h4>Update</h4><p>Oke begini cara pakai <code>aws-cli</code>. Paket ini bisa di<i>install</i> dan dikonfigurasi dengan perintah</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session">
<span class="token output"> $ doas pkg install -y py-awscli
 $ aws configure
 AWS Access Key ID [None]: W3wNV6XRh1YJ8arQKBoongNqGhQ
 AWS Secret access key [None]: FakeLIpA3l0VjttIiHaZgdMXF4ujQOYTyBtztpSy7w0yD2qzphOQwRtvj
 Default Region name [None]: us-east-1
 Default output format [None]: JSON
</span></code></pre><p>AWS Access Key ID dan Secret harus sama dengan yang dimasukkan di file <code>museum.yaml</code>.</p></div><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">aws s3api put-bucket-cors \
--endpoint s3.taa.ee \
--bucket ente-bucket \
--cors-configuration file://home/poes/cors.json</span></span>
</code></pre><ol start="5"><li>Ente Desktop Meski ada web GUI, memasang Ente Desktop app adalah pilihan yang lebih baik karena pengalaman ane saat pakai web gui sebagian besar media (terutama video) yang ane unggah tidak bisa di<em>generate thumbnail</em>nya atau <em>frame</em> pertama muncul warna gelap/hitam. Namun masalah ini tidak terjadi saat ane pakai Ente Desktop app.</li></ol><p>Untuk memasang tinggal unduh saja aplikasinya di <a href="https://ente.io/download/">halaman Ente Desktop</a> atau untuk versi termutakhir bisa lewat <a href="https://github.com/ente-io/ente/tree/main/desktop">Repo Github Ente Desktop</a>. Satu - satunya kelemahan yang ane ga suka adalah Ente Desktop app dibangun dengan electron 👎🏾.</p><hr><h4 id="linux" tabindex="-1">Linux <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/#linux">#</a></h4><p>Khusus untuk yang ingin mudah hidupnya, gunakan Linux karena Ente bisa diinstall hanya dengan 1 baris perintah. Apa itu adek - adek?</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"</span></span>
</code></pre><p>Setelah semua selesai Ente akan tersedia di <code>http://localhost:3000</code>. Linux itu mudah bukan? bukan.</p><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/freebsd">#freebsd</a></h4><div class="related_post_list"><span class="related_post_date">14 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-blocklist/"> <h4>Blocklistd: cara ampuh menghalau penyusup di FreeBSD</h4></a><p class="post_ringkasan">pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.</p></div><div class="related_post_list"><span class="related_post_date">04 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/"> <h4>Self host Ente Photos di FreeBSD</h4></a><p class="post_ringkasan">Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula</p></div><div class="related_post_list"><span class="related_post_date">21 Des 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-backup-restic/"> <h4>Backup data dengan Restic dan Rclone</h4></a><p class="post_ringkasan">Sedia backup sebelum hujan badai datang</p></div><div class="related_post_list"><span class="related_post_date">14 Nov 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-self-hosting-s3/"> <h4>Self hosting S3 di FreeBSD dengan Garage</h4></a><p class="post_ringkasan">Memasang garage sebagai peladen S3 di FreeBSD</p></div><div class="related_post_list"><span class="related_post_date">26 Des 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/jika-lupa-password-root-freebsd/"> <h4>Jika lupa password root FreeBSD</h4></a><p class="post_ringkasan">Cara ini sering dipakai untuk merubah password root jika kelupaan</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KE3PT1SQ9KEB9077C1X2MMD8">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KE3PT1SQ9KEB9077C1X2MMD8"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Backup data dengan Restic dan Rclone</title>
      <link>https://kusaeni.com/jurnal/freebsd-backup-restic/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/freebsd-backup-restic/</guid>
      <content:encoded>
        <![CDATA[<p>Kelemahan self host aplikasi adalah repot dalam pemeliharaan sistem dan ini ane rasakan ketika Ente Photos bermasalah di database-nya. Entah karena upgrade NextJS atau karena hal lainnya. Masalah semakin pelik ketika entah bagaimana postgresql menghapus semua entry database media milik Ente, bisa jadi karena ane salah memasukkan perintah SQL. Untungnya ane sempat membuat backup beberapa minggu sebelumnya, sehingga bisa meng<em>restore</em> database kembali.</p><p>Oleh karena itu penting bagi ane untuk rutin melakukan backup database (dan data penting lainnya) untuk berjaga - jaga jika suatu hari ada masalah. Backup database yang ane restore tersebut ane backup di host (postgresql di jail), syukur Alhamdulillah tapi model backup seperti ini tak aman. Karena jika ane membuat kesalahan lagi dan <a href="https://sok.egois.org/users/poes/statuses/01KCH9ENQC46V5J8QQA8HFNYJ3">host error/rusak</a> maka otomatis backup tidak akan bisa ane akses. Maka memiliki backup di tempat berbeda (cloud storage) menjadi sebuah kewajiban yang tidak bisa ane hindari.</p><p>Namun ane ga mau keluarkan uang untuk sewa cloud storage, jadi ane pilih beberapa layanan backup dan cloud storage gratisan yang bisa dipakai. Salah duanya adalah <a href="https://borgbase.com/">Borgbase</a> dan <a href="https://koofr.net/">Koofr</a>. Keduanya memberikan storage gratis sebesar 10GB per user dan itu sudah cukup untuk membackup database yang ane miliki, apalagi nantinya ane akan pakai tool backup yang mendukung <a href="https://id.wikipedia.org/wiki/Deduplikasi_data">deduplikasi</a>. Dalam hal ini ane akan memakai <a href="https://restic.net/">Restic</a> karena tool ini yang mendukung proses backup ke Borgbase maupun Koofr.</p><div class="postnotes"><p>Seperti biasa ane mempergunakan <a href="https://www.freebsd.org/">FreeBSD</a> rilis 14.3 sebagai OS, namun baik rclone maupun restic tersedia dengan luas untuk sistem operasi lainnya.</p></div><p>Di FreeBSD restic dan rclone sudah tersedia di dalam repo sehingga tak perlu build manual atau lewat <a href="https://www.freshports.org/sysutils/restic/">Freshports</a><sup><a class="footnote-ref" href="https://kusaeni.com/jurnal/freebsd-backup-restic/#fn-1" id="fnref-1">1</a></sup></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg install -y restic rclone</span></span>
</code></pre><h3 id="borgbase" tabindex="-1">Borgbase <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-backup-restic/#borgbase">#</a></h3><p>Ane mendaftar untuk trial (lifetime) dan mendapatkan 10GB storage dengan batasan hanya bisa dipakai untuk 2 repositori/repo saja. Setelah login ane bikin repo baru dengan nama “VaultWarden” karena akan dipakai untuk backup database SQLite Vaultwarden.</p><p>Di tab Basic, ane pilih Repo Region ke EU. Alasannya? karena EU biasanya lebih cepat diakses dari Indonesia dan karena sentimen politik saja. Untuk Repo Format ada 2 pilihan yaitu memakai <a href="https://borgbackup.readthedocs.io/en/stable/">Borg</a> dan Restic. Borg adalah tool backup yang juga dibuat oleh Borgbase, namun disini ane akan pakai Restic. Ane abaikan tab Access dan Monitoring, tapi di tab Advanced ane aktifkan Enable Storage Limit ke 5GB (sisanya untuk repo kedua).</p><p>Borg akan memberikan URL restic repo, yang ini harus disimpan karena nantinya akan dipakai untuk restic mengakses repo. Formatnya biasanya seperti ini:</p><pre class="language-text" tabindex="0"><code class="language-text">rest:https://trkhdakh06:akljhkldjav@trp54607.repo.borgbase.com
</code></pre><p>Di local atau di VPS ane kemudian melakukan inisialisasi restic repo, namun yang pertama kali dilakukan adalah memastikan URL restic repo tersedia secara global<sup><a class="footnote-ref" href="https://kusaeni.com/jurnal/freebsd-backup-restic/#fn-2" id="fnref-2">2</a></sup>. Maka di file <code>~/.profile</code> perlu ane tambahkan baris berikut:</p><pre class="language-text" tabindex="0"><code class="language-text">export RESTIC_REPOSITORY="rest:https://trkhdakh06:akljhkldjav@trp54607.repo.borgbase.com"
</code></pre><p>kemudian refresh shell profile dengan perintah <code>. ~/.profile</code> atau logout dari session dan login kembali. Setelah itu jalankan inisialisasi restic repo dengan perintah:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas restic init</span></span>
</code></pre><p>Restic akan meminta password (2 kali), password ini akan dipergunakan restic untuk mengakses repo. Begitu inisialisasi selesai maka repo sudah siap dipergunakan. Untuk memulai backup bisa dengan perintah berikut:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas restic backup /path/ke/data_backup</span></span>
</code></pre><p>Untuk melihat status backup bisa dengan perintah:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas restic snapshots</span></span>
<span class="token output">repository c4brutd5 opened (version 2, compression level auto)
ID        Time                 Host        Tags        Paths                            Size
-------------------------------------------------------------------------------------------------
7f3ffd40  2025-12-19 02:01:13  pribsd                  /usr/local/www/vaultwarden/data  5.441 MiB
4fbca2f9  2025-12-20 02:00:34  pribsd                  /usr/local/www/vaultwarden/data  5.504 MiB
25tgeb19  2025-12-21 02:00:20  pribsd                  /usr/local/www/vaultwarden/data  5.945 MiB
-------------------------------------------------------------------------------------------------
3 snapshots
</span></code></pre><h3 id="koofr" tabindex="-1">Koofr <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-backup-restic/#koofr">#</a></h3><p>Pada dasarnya cara backup ke Koofr sama saja dengan Borgbase namun Koofr tidak bisa diakses langsung melalui restic, disini rclone tampil sebagai jembatan.</p><div class="postnotes"><p>Kelebihan memakai Koofr adalah dia tidak membatasi jumlah repositori karena seolah - olah seperti penyimpanan biasa karena dikenali sebagai rclone.</p></div><pre class="no-border language-none" tabindex="0"><code class="language-none">
+-----------------------------------+        +------------+
| FreeBSD Host                      |        |            |
|                                   |        |            |
|  +----------+       +----------+  | https  |    Koofr   |
|  |  Restic  |------&gt;|  Rclone  |----------&gt;|   Storage  |
|  +----------+       +----------+  |        |            |
|                                   |        |            |
+-----------------------------------+        +------------+
</code>
</pre><p>Namun agar bisa diakses dengan rclone, Koofr perlu membuat semacam password khusus. Caranya adalah login ke dalam Koofr kemudian masuk ke <strong>Preferences</strong> dan buka halaman <strong>Password</strong>. Gulir ke bawah dan temukan <strong>App Passwords</strong>, bikin nama app dan kemudian klik tombol <strong>Generate</strong>. Catat password acak yang dibuat oleh Koofr karena akan dipakai untuk akses rclone.</p><p><img alt="Koofr setup app password" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/restic/SCR-20251221-msdr_BW6Y0vqdH.png"></p><p>Di local atau VPS, setup rclone dengan perintah <code>rclone config</code> dan isian seperti berikut:</p><table><thead><tr><th>Uraian</th><th style="text-align:center">Value</th><th style="text-align:left">Keterangan</th></tr></thead><tbody><tr><td>name</td><td style="text-align:center">koofr</td><td style="text-align:left">bisa diisi bebas</td></tr><tr><td>type</td><td style="text-align:center">cloud</td><td style="text-align:left">bisa diisi bebas</td></tr><tr><td>provider</td><td style="text-align:center">koofr</td><td style="text-align:left">harus Koofr</td></tr><tr><td>user</td><td style="text-align:center"><a href="mailto:email@emailku.org">email@emailku.org</a></td><td style="text-align:left">email yang dipakai untuk login ke Koofr</td></tr><tr><td>password</td><td style="text-align:center">password</td><td style="text-align:left">App password dari koofr</td></tr></tbody></table><p>Jika data yang dimasukkan benar, maka tes koneksi dengan perintah <code>rclone lsd koofr:</code> maka akan muncul daftar folder yang ada di dalam Koofr ane.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">rclone lsd koofr:</span></span>
<span class="token output">         -1 2000-01-01 07:00:00        -1 My documents
         -1 2000-01-01 07:00:00        -1 Vaultwarden
</span></code></pre><p>Rclone sudah selesai saatnya mengatur restic. Seperti di Borgbase maka di <code>~/.profile</code> rubah menjadi</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token output">export RESTIC_REPOSITORY=rclone:koofr:Vaultwarden
</span></code></pre><div class="postnotes kuning-gading"><p>Jika ingin mempergunakan keduanya (Borgbase maupun Koofr) ane buat 2 variable dengan nama masing - masing <code>$RESTIC_BORG</code> dan <code>$RESTIC_KOOFR</code>. Namun saat operasi restic harus menyertakan flag <code>-r</code> dan nama variable, contohnya seperti ini:</p><pre class="language-none" tabindex="0"><code class="language-none">restic backup -r $RESTIC_KOOFR /path/ke/backup_data</code></pre></div><p>Selesai, kemudian tinggal melakukan backup dengan perintah seperti sebelumnya di Borgbase. Keren!. Level selanjutnya adalah automatisasi dengan shell script dan cronjob, tapi ane ga akan bahas disini karena itu hanyalah rangkuman command di atas.</p><h4 id="update" tabindex="-1">Update <a class="header-anchor" href="https://kusaeni.com/jurnal/freebsd-backup-restic/#update">#</a></h4><p>Oke - oke berikut contoh shell script sederhana untuk backup data ke Koofr dan Borg.</p><pre class="language-bash" tabindex="0"><code class="language-bash"><span class="token shebang important">#!/bin/sh</span>

<span class="token assign-left variable">SERVICE</span><span class="token operator">=</span>vaultwarden
<span class="token assign-left variable">DATA</span><span class="token operator">=</span>/usr/local/www/vaultwarden/data

<span class="token comment"># Restic config</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">RESTIC_PASSWORD</span><span class="token operator">=</span><span class="token string">'passwordku-yang-sangat-panjang'</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">RESTIC_BORG</span><span class="token operator">=</span><span class="token string">'rest:https://um7lty27:bo1oY8i83GV2pgKG@um7lty27.repo.borgbase.com'</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">RESTIC_KOOFR</span><span class="token operator">=</span><span class="token string">'rclone:koofr:Vaultwarden'</span>

<span class="token comment"># Masih running?</span>
<span class="token keyword">if</span> pgrep <span class="token parameter variable">-f</span> <span class="token variable">$SERVICE</span> <span class="token operator">&gt;</span>/dev/null<span class="token punctuation">;</span> <span class="token keyword">then</span>
        <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$SERVICE</span>: masih berjalan"</span>
        <span class="token builtin class-name">echo</span> <span class="token string">"Mematikan <span class="token variable">$SERVICE</span>"</span>
        <span class="token function">service</span> <span class="token variable">$SERVICE</span> stop
        <span class="token builtin class-name">echo</span> <span class="token string">"Service <span class="token variable">$SERVICE</span> sudah berhenti."</span>
<span class="token keyword">else</span>
        <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$SERVICE</span>: sudah berhenti"</span>
<span class="token keyword">fi</span>


<span class="token function">sleep</span> <span class="token number">5</span>
<span class="token builtin class-name">echo</span> <span class="token string">"Restic: memulai backup data..."</span>
<span class="token builtin class-name">echo</span> <span class="token string">"Restic: backup data ke Koofr"</span>
restic backup <span class="token variable">$DATA</span> <span class="token parameter variable">-r</span> <span class="token variable">$RESTIC_KOOFR</span>
<span class="token function">sleep</span> <span class="token number">3</span>
<span class="token builtin class-name">echo</span> <span class="token string">"Restic: backup data ke Borg"</span>
restic backup <span class="token variable">$DATA</span> <span class="token parameter variable">-r</span> <span class="token variable">$RESTIC_BORG</span>
<span class="token function">sleep</span> <span class="token number">3</span>
<span class="token builtin class-name">echo</span> <span class="token string">"Restic: backup data selesai."</span>
<span class="token function">sleep</span> <span class="token number">5</span>

<span class="token comment"># Prune : hapus snapshot lama biar storage ga penuh</span>
<span class="token builtin class-name">echo</span> <span class="token string">"Restic: cleaning snapshot lama"</span>
restic forget --keep-last <span class="token number">7</span> <span class="token parameter variable">--prune</span> <span class="token parameter variable">-r</span> <span class="token variable">$RESTIC_KOOFR</span>
<span class="token function">sleep</span> <span class="token number">3</span>
restic forget --keep-last <span class="token number">7</span> <span class="token parameter variable">--prune</span> <span class="token parameter variable">-r</span> <span class="token variable">$RESTIC_BORG</span>
<span class="token builtin class-name">echo</span> <span class="token string">"Restic: cleaning snapshot lama selesai."</span>
<span class="token function">sleep</span> <span class="token number">5</span>

<span class="token comment">#start service</span>
<span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$SERVICE</span>: memulai service..."</span>
<span class="token function">service</span> <span class="token variable">$SERVICE</span> start
<span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$SERVICE</span>: service sudah berjalan."</span>
</code></pre><p>Simpan sebagai misalnya <code>restic_warden.sh</code> di <code>/usr/local/bin/restic_warden.sh</code> dan kemudian beri atribut agar bisa dijalankan dengan</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas chmod +x /usr/local/bin/restic_warden.sh</span></span>
</code></pre><p>Untuk automatisasi bisa memanfaatkan cronjob, rencananya ane akan backup setiap hari pada pukul 02.00 WIB dan setiap kegiatan akan di-log di <code>/var/log/restic_warden.log</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas crontab -e</span></span>
<span class="token output">0 2 * * * /usr/local/bin/restic_warden.sh &gt; /var/log/restic_warden.log 2&gt;&amp;1
</span></code></pre><hr><p>Demikian cara untuk melakukan backup data dengan mempergunakan tools restic dan rclone di FreeBSD, caranya mudah dan efektif. Restic sudah memiliki fitur untuk melakukan enkripsi data sehingga terjamin keamanannya dan tidak perlu memakai aplikasi pihak ketiga seperti <a href="https://github.com/FiloSottile/age">age</a>.</p><p>Meski akan sangat kuat jika disandingkan dengan age, namun hal ini akan menghilangkan kemampuan restic untuk deduplikasi data. Sedangkan rclone ini adalah tool yang sangat powerfull untuk akses data dan bahkan bisa menjadi server webdav sendiri secara built-in. Dia semacam swiss army knife untuk akses data kemana saja. Menggabungkan restic dan rclone menjadi salah satu solusi prima untuk operasi backup data di FreeBSD.</p><hr><aside class="footnotes" role="note"><h4>Footnotes:</h4><div class="notes"><div class="note-id"><a href="https://kusaeni.com/jurnal/freebsd-backup-restic/#fnref-1" id="fn-1">1</a></div><p>Namun boleh gunakan Freshports jika ingin menginstall rilis terbaru karena biasanya Freshports lebih cepat dalam update.</p></div><div class="notes"><div class="note-id"><a href="https://kusaeni.com/jurnal/freebsd-backup-restic/#fnref-2" id="fn-2">2</a></div><p>Jika restic dijalankan dengan shell script, hal ini bisa dilewati dan lebih baik mengatur agar URL restic dipanggil saat shell script dijalankan</p></div></aside><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/freebsd">#freebsd</a></h4><div class="related_post_list"><span class="related_post_date">14 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-blocklist/"> <h4>Blocklistd: cara ampuh menghalau penyusup di FreeBSD</h4></a><p class="post_ringkasan">pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.</p></div><div class="related_post_list"><span class="related_post_date">04 Jan 2026</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-ente-selfhost/"> <h4>Self host Ente Photos di FreeBSD</h4></a><p class="post_ringkasan">Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula</p></div><div class="related_post_list"><span class="related_post_date">21 Des 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-backup-restic/"> <h4>Backup data dengan Restic dan Rclone</h4></a><p class="post_ringkasan">Sedia backup sebelum hujan badai datang</p></div><div class="related_post_list"><span class="related_post_date">14 Nov 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/freebsd-self-hosting-s3/"> <h4>Self hosting S3 di FreeBSD dengan Garage</h4></a><p class="post_ringkasan">Memasang garage sebagai peladen S3 di FreeBSD</p></div><div class="related_post_list"><span class="related_post_date">26 Des 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/jika-lupa-password-root-freebsd/"> <h4>Jika lupa password root FreeBSD</h4></a><p class="post_ringkasan">Cara ini sering dipakai untuk merubah password root jika kelupaan</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KD0P1KEZNSM2H09G1S5HJBV8">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KD0P1KEZNSM2H09G1S5HJBV8"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Unbound di OpenBSD</title>
      <link>https://kusaeni.com/jurnal/openbsd-unbound/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/openbsd-unbound/</guid>
      <content:encoded>
        <![CDATA[<p><strong>TLDR</strong>: <a href="https://man.openbsd.org/unbound">Unbound</a> adalah sebuah <em>tool</em> untuk mengvalidasi, menyimpan DNS secara lokal, dan mencari DNS secara rekursif (sampai ke root DNS) yang sudah tersedia di <code>base</code> OpenBSD. Gunanya tentu meningkatkan privasi karena tidak mengarahkan langsung <em>domain resolver</em> DNS <em>provider</em> seperti Google DNS (8.8.8.8), Cloudflarfe DNS (1.1.1.1), atau Quad9 (9.9.9.9).</p><p>Maka ane perlu memasang <em>tools</em> ini untuk disandingkan dengan Wireguard yang <a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/">sebelumnya sudah dipasang</a>. Selain sebagai DNS Resolver nantinya ane akan pasang <em>ads blocker</em> juga untuk menghalau iklan dan menghemat bandwitdh.</p><div class="terkait full"><span class="ter">Artikel Terkait</span><div class="kait"><h4><a class="hRelasi" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/">Wireguard di OpenBSD</a></h4><p>WireGuard adalah VPN protokol yang modern, sederhana, cepat, dan secure. Dibanding protokol lainnya (OpenVPN, IPSec), WireGuard dirancang dengan filosofi minimalis - konfigurasi lebih mudah, dan performa lebih tinggi. Begini cara pasangnya di OpenBSD.</p></div></div><hr><h3 id="memasang-unbound" tabindex="-1">Memasang Unbound <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-unbound/#memasang-unbound">#</a></h3><p>Karena sudah tersedia di <code>base</code> maka tinggal diperiksa apakah Unbound sudah berjalan atau belum. Jika <em>fresh install</em> atau <em>default</em> OpenBSD akan pakai <a href="https://man.openbsd.org/unwind">Unwind</a> sebagai DNS Resolver, Unwind ini mirip Unbound tapi lebih sederhana namun tidak bisa disandingkan dengan Wireguard secara langsung karena secara <em>default</em> hanya LISTEN di localhost saja. Jika Unwind berjalan sebagai DNS Resolver, seharusnya Unbound tidak akan berjalan demikian pula sebaliknya. Cek apakah Unwind sudah jalan, jika iya harus dimatikan.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl check unwind</span></span>
<span class="token output">unwind(ok)
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas stop unwind &amp;&amp; doas disable unwind</span></span>
<span class="token output">unwind (failed)
</span></code></pre><aside>Defaultnya saat disable sebuah service, OpenBSD akan menampilkan pesan <code>(failed)</code> jika service tersebut (sudah) tidak berjalan.</aside><p>Kemudian jalankan Unbound</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl check unbound</span></span>
<span class="token output">unbound (failed)
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl enable unbound</span></span>
<span class="token output">unbound (ok)
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl start unbound</span></span>
<span class="token output">unbound (ok)
</span></code></pre><h4 id="cek-nameserver-yang-dipakai" tabindex="-1">Cek nameserver yang dipakai <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-unbound/#cek-nameserver-yang-dipakai">#</a></h4><p>Seperti keluarga NIX lainnya, OpenBSD juga pakai <code>/etc/resolv.conf</code> sebagai DNS Resolution.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cat /etc/resolv.conf</span></span>
<span class="token output">nameserver 127.0.0.1
nameserver 8.8.8.8 # resolvd: vio0
nameserver 9.9.9.9 # resolvd: vio0
lookup file bind
</span></code></pre><p>Jika <code>nameserver 127.0.0.1</code> sudah ada di dalam file <code>/etc/resolv.conf</code> maka sebenarnya sudah siap untuk memanfaatkan Unbound (atau Unwind) namun jika tidak ada maka harus mengatur secara manual file ini (menambahkan <em>entry</em> ke dalam file ini).</p><p>Untuk <code># resolvd: vio0</code> menandakan bahwa baris <em>entry</em> tersebut ditulis oleh <a href="https://man.openbsd.org/resolvd">resolvd</a>, hal ini bisa menyebabkan konflik karena <code>resolvd</code> lebih mengutamakan Unwind. Untuk itu <em>daemon</em> ini harus di-<em>disable</em> karena <a href="https://man.openbsd.org/OpenBSD-7.5/dhclient">dhclient</a> sebagai pengelola file <code>/etc/resolv.conf</code> kemungkinan akan menulis ulang file ini ketika selesai di-<em>edit</em> sehingga file <code>/etc/resolv.conf</code> akan balik ke default.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl check resolvd</span></span>
<span class="token output">resolvd(ok)
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl stop resolvd &amp;&amp; doas rcctl disable resolvd</span></span>
<span class="token output">resolv (failed)
</span></code></pre><p>Dalam banyak kasus yang ane temukan, <code>nameserver 127.0.0.1</code> tidak ada di dalam file <code>/etc/resolv.conf</code> karena di-<em>overwrite</em> oleh <code>dhclient</code> dan biasanya tidak bisa di-<em>edit</em> bahkan dengan akun <code>root</code> sekalipun. Namun kadang kala masih bisa <s>dirubah</s> ditambahkan <em>entry</em>-nya dengan cara ini</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas echo 'nameserver 127.0.0.1' &gt; /etc/resolv.conf</span></span>
</code></pre><p>secepatnya setelah perintah ini, beri status <em>imuttable</em> ke file ini agar <code>dhclient</code> ga bisa balikin isinya ke semula (jika dhclient tidak boleh dinonaktifkan karena dipakai untuk mendapatkan IP dari DHCP Server).</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas chflags schg /etc/resolv.conf</span></span>
</code></pre><div class="postnotes pink"><p>Jika cara di atas tidak berhasil dan atau karena pakai VPS yang mau tak mau harus pakai <code>dhcp</code> untuk mendapatkan IP, maka gunakan file <code>/etc/dhclient.conf</code> untuk menambahkan <i>entry</i> nameserver</p><pre class="language-none" tabindex="0">   <code class="language-none">
      $ doas vim /etc/dhclient.conf
      prepend domain-name-servers 127.0.0.1;
    </code>  </pre></div><h3 id="konfigurasi-unbound" tabindex="-1">Konfigurasi Unbound <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-unbound/#konfigurasi-unbound">#</a></h3><p><em>Default</em>-nya konfigurasi Unbound terletak di <code>/var/unbound/etc/unbound.conf</code>, konfigurasi minimalis yang bisa dipakai untuk mengawali adalah sebagai berikut</p><div class="postnotes merah"><p>Di FreeBSD, pengaturan Unbound terletak di <code>/usr/local/etc/unbound/unbound.conf</code>. Sedangkan isinya memiliki format yang sama.</p></div><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /var/unbound/etc/unbound.conf</span></span>
</code></pre><pre class="language-yaml" tabindex="0"><code class="language-yaml">server:
    verbosity: 1
    interface: 127.0.0.1
    interface: 10.0.0.1                # IP server Wireguard
    access-control: 127.0.0.0/8 allow
    access-control: 10.0.0.0/24 allow. # IP range Wireguard
    cache-max-ttl: 86400
    cache-min-ttl: 3600
    hide-identity: yes
    hide-version: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    auto-trust-anchor-file: "/var/unbound/db/root.key"
    prefetch: yes

forward-zone:
    name: "."
    forward-tls-upstream: yes
    forward-addr: 1.1.1.1@853         # Cloudflare DNS over TLS
    forward-addr: 9.9.9.9@853         # Quad9 DNS over TLS
</code></pre><aside>Perhatikan bagian <code>verbosity: 1</code>, ini penting untuk menampilkan log dari unbound, pilihan lainnya adalah 2, 3, 4, atau 5. Semakin tinggi nilainya maka semakin jelas log yang ditampilkan.</aside><p>Di bagian <code>interface: 10.0.0.1</code> perlu ditambahkan agar IP server dari Wireguard bisa dijadikan sebagai IP DNS resolver selain 127.0.0.1 (<mark>ini adalah kelebihan dari Unbound yang tidak bisa/dimiliki oleh Unwind</mark>). Sekalian ane tambahkan <code>access-control: 10.0.0.0/24 allow</code> untuk megijinkan semua IP di dalam Wireguard memanfaatkan Unbound.</p><p>simpan file ini dan kemudian <em>reload</em> <code>unbound</code></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas rcctl reload unbound</span></span>
<span class="token output">unbound (ok)
</span></code></pre><p>jika hasilnya <em>failed</em>, cek ulang konfigurasi <code>unbound.conf</code> dengan perintah</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas unbound-checkconf</span></span>
<span class="token output">unbound-checkconf: no errors in /var/unbound/etc/unbound.conf
</span></code></pre><h3 id="percobaan" tabindex="-1">Percobaan <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-unbound/#percobaan">#</a></h3><p>Waktunya untuk mencoba!.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">dig kusaeni.com</span></span>
<span class="token output">; &lt;&lt;&gt;&gt; dig 9.10.8-P1 &lt;&lt;&gt;&gt; kusaeni.com
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 34850
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;kusaeni.com.                   IN      A

;; ANSWER SECTION:
kusaeni.com.            12014   IN      A       34.120.54.55

;; Query time: 17 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 07 13:22:42 WIB 2025
;; MSG SIZE  rcvd: 56
</span></code></pre><p>Alhamdulillah Unbound sudah berjalan, bisa dicek di baris <code>;; SERVER: 127.0.0.1#53(127.0.0.1)</code> dimana <em>resolver</em> sekarang memakain IP <code>127.0.0.1</code> sebagai DNS <em>resolver</em> utama.</p><p>Kemudian ane sambungkan MacOS (wireguard klien) ke server namun sebelum itu ane rubah pengaturan DNS di Wireguard agar mengarah ke <code>10.0.0.1</code> yaitu DNS server Wireguard.</p><p><img alt="Wireguard Client Config, change DNS Resolver IP" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/Unbound/SCR-20251207-Unbound_bzEPcBfMq.png"></p><p>di terminal (client/macos) dicoba untuk tes <em>resolver</em></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token output">➜  ~ dig kusaeni.com

; &lt;&lt;&gt;&gt; DiG 9.10.6 &lt;&lt;&gt;&gt; kusaeni.com
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 5
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;kusaeni.com.                   IN      A

;; ANSWER SECTION:
kusaeni.com.            11880   IN      A       34.120.54.55

;; Query time: 171 msec
;; SERVER: 10.0.0.1#53(10.0.0.1)
;; WHEN: Sun Dec 07 13:24:56 WIB 2025
;; MSG SIZE  rcvd: 56
</span></code></pre><p>Terlihat bahwa klien sudah mempergunakan IP dari server Wireguard sebagai <em>resolvers</em>.</p><h3 id="block-ads%2Fiklan" tabindex="-1">Block Ads/iklan <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-unbound/#block-ads%2Fiklan">#</a></h3><p>Jutaan orang tau kalo <em>browsing</em> di internet itu sering banget diganggu dengan iklan yang bejibun, untuk itu orang sering pakai <a href="https://ublockorigin.com/">µBlock Origin</a> untuk menghalau iklan. <em>Powerfull</em> namun sayangnya hanya tersedia di <em>browser</em> tidak <em>system wide</em>. Unbound bisa bantu untuk masalah yang terakhir ini, karena <em>blocking</em> berada di sisi DNS maka efeknya akan <em>system wide</em> alias global selama pakai DNS tersebut. Caranya seperti ini</p><p>Unduh dulu daftar URL iklan yang sudah dikurasi oleh orang - orang, ane pakai dari Steven Black.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas mkdir -p /var/unbound/etc/include</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas wget https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts -O /tmp/adblock-hosts</span></span>
</code></pre><p>karena daftar di dalam file <code>adblock-hosts</code> ini formatnya berbeda dengan format yang dipakai oleh Unbound maka perlu merubah format tersebut, bisa pakai <em>shell script</em> seperti di bawah ini</p><pre class="language-bash" tabindex="0"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
<span class="token assign-left variable">BLOCKLIST</span><span class="token operator">=</span><span class="token string">"/tmp/adblock-hosts"</span>
<span class="token assign-left variable">CONFIG</span><span class="token operator">=</span><span class="token string">"/var/unbound/etc/include/adblock.conf"</span>

<span class="token comment"># Extract domains (skip localhost/0.0.0.0 lines, sort/unique)</span>
<span class="token function">grep</span> <span class="token string">'^0\.0\.0\.0'</span> <span class="token string">"<span class="token variable">$BLOCKLIST</span>"</span> <span class="token operator">|</span> <span class="token function">awk</span> <span class="token string">'{print $2}'</span> <span class="token operator">|</span> <span class="token function">grep</span> <span class="token parameter variable">-v</span> <span class="token string">'localhost'</span> <span class="token operator">|</span> <span class="token function">sort</span> <span class="token parameter variable">-u</span> <span class="token operator">&gt;</span> /tmp/domains.txt

<span class="token comment"># Generate Unbound config</span>
<span class="token builtin class-name">echo</span> <span class="token string">"# Auto-generated adblock list"</span> <span class="token operator">&gt;</span> <span class="token string">"<span class="token variable">$CONFIG</span>"</span>
<span class="token builtin class-name">echo</span> <span class="token string">"server:"</span> <span class="token operator">&gt;&gt;</span> <span class="token string">"<span class="token variable">$CONFIG</span>"</span>
<span class="token keyword">while</span> <span class="token builtin class-name">read</span> <span class="token parameter variable">-r</span> domain<span class="token punctuation">;</span> <span class="token keyword">do</span>
    <span class="token builtin class-name">echo</span> <span class="token string">"    local-zone: <span class="token entity" title="\&quot;">\"</span><span class="token variable">$domain</span><span class="token entity" title="\&quot;">\"</span> refuse"</span> <span class="token operator">&gt;&gt;</span> <span class="token string">"<span class="token variable">$CONFIG</span>"</span>
<span class="token keyword">done</span> <span class="token operator">&lt;</span> /tmp/domains.txt

<span class="token function">rm</span> /tmp/domains.txt
<span class="token builtin class-name">echo</span> <span class="token string">"Adblock config updated: <span class="token variable"><span class="token variable">$(</span><span class="token function">wc</span> <span class="token parameter variable">-l</span> <span class="token operator">&lt;</span> <span class="token string">"<span class="token variable">$CONFIG</span>"</span><span class="token variable">)</span></span> entries"</span>
</code></pre><p>kemudian simpan dengan nama misalnya <code>convert-adsblock.sh</code> (taruh dimana saja, kalo ane di <code>~/.local/bin</code>) dan rubah ijin file supaya bisa dijalankan <code>chmod +x convert-adsblock.sh</code> kemudian jalankan dengan perintah <code>./convert-adsblock.sh</code>. Tunggu sampai selesai.</p><p>Agar bisa dibaca oleh Unbound, ane rubah konfigurasi <code>unbound.conf</code> dan menyisipkan baris <code>include: "/etc/unbound/adblock.conf"</code> di blok <code>server</code> sehingga hasilnya seperti ini</p><pre class="language-yaml" tabindex="0"><code class="language-yaml">server:
    verbosity: 1
    interface: 127.0.0.1
    interface: 10.0.0.1                # IP server Wireguard
    access-control: 127.0.0.0/8 allow
    access-control: 10.0.0.0/24 allow. # IP range Wireguard
    cache-max-ttl: 86400
    cache-min-ttl: 3600
    hide-identity: yes
    hide-version: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    auto-trust-anchor-file: "/var/unbound/db/root.key"
    prefetch: yes
    include: "/var/unbound/etc/include/adblock.conf"`
</code></pre><p>simpan dan jalankan lagi <code>unbound-checkconf</code> untuk mengvalidasi konfigurasi. Jika tidak ada masalah, <em>reload</em> Unbound dan test dengan mengunjungi situs seperti <a href="http://detik.com/">detik.com</a> yang banyak iklannya itu dan cek apakah iklan - iklannya sudah hilang atau berkurang. Ya berkurang karena ada beberapa iklan yang di-<em>host</em> di internal situs sehingga tidak terdeteksi oleh Unbound. Tapi ini wajar, karena jika terdeteksi di dalam adblock maka bisa saja malah situs tersebut yang tidak akan bisa dibuka karena akan diblok oleh Unbound. Ga masalah karena 99% iklan pasti akan terfilter oleh Adsblok dan Unbound.</p><p>Contoh lain adalah ada situs yang pakai banner iklan dan banner tersebut disimpan di <a href="http://blogspot.com/blogger.com">blogspot.com/blogger.com</a>, sehingga pasti akan tetap muncul kecuali domain <a href="http://blogspot.com/blogger.com">blogspot.com/blogger.com</a> diblok. Resikonya maka domain tersebut tidak akan bisa dibuka lagi. Maka disini µBlock Origin bisa bermanfaat untuk memblok elemen tertentu tanpa memblok domain.</p><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/openbsd">#openbsd</a></h4><div class="related_post_list"><span class="related_post_date">29 Nov 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/"> <h4>Wireguard di OpenBSD</h4></a><p class="post_ringkasan">Catatan ane tentang memasang Wireguard di OpenBSD, yang katanya mudah tapi cukup bikin pusing juga</p></div><div class="related_post_list"><span class="related_post_date">06 Des 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/menginstall-openbsd-di-vps-linux/"> <h4>Menginstall OpenBSD di VPS berbasis Linux</h4></a><p class="post_ringkasan">Provider tidak menyediakan OS OpenBSD dan atau ingin menginstall sendiri?</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KBVV3FPM7M0Y53ASN498SM5A">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KBVV3FPM7M0Y53ASN498SM5A"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Wireguard di OpenBSD</title>
      <link>https://kusaeni.com/jurnal/openbsd-install-wireguard/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/openbsd-install-wireguard/</guid>
      <content:encoded>
        <![CDATA[<nav class="toc"><h4>Daftar Isi</h4><ol><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#setup-wireguard-di-vps">Setup Wireguard di VPS</a> <ul><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#buat-key">Buat key</a></li><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#buat-konfigurasi-untuk-wireguard">Buat konfigurasi untuk Wireguard</a></li></ul></li><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#wireguard-client-di-macos">Wireguard Client di macos</a></li><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#finishing-wireguard-di-vps">Finishing WireGuard di VPS</a> <ul><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#killswitch">Killswitch</a></li><li><a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#dengan-aplikasi">Dengan aplikasi</a></li></ul></li></ol></nav><div class="postnotes pink flex"><img class="fuck logo" src="https://kusaeni.com/assets/img/fbsd.png"><div class="flex-kanan"><p>Tutorial ini juga bisa diterapkan di FreeBSD, perbedaannya hanya penggunaan <i>package manager</i> untuk memasang paket - paket yang dibutuhkan saja.</p><p>Jika di OpenBSD mempergunakan <code>pkg_add</code> maka di FreeBSD memakai <code>pkg</code>.</p></div></div><p>Kata orang - orang kalo pakai BSD paling gampang di OpenBSD karena Wireguard sudah ada di dalam base, oke karena memang sudah diinstall OpenBSD bisa langsung lanjut. Akan tetapi, ternyata itu bohong. Semua sama saja, harus mulai dari nol (kayak di BSD lainnya). Mau gimana lagi nasi sudah jadi krupuk maka mau ga mau lanjut.</p><p>Catatan ini akan dibagi menjadi 2 bagian yaitu memasang Wireguard di sisi server (VPS) dan sisi client (macos).</p><h2 id="setup-wireguard-di-vps" tabindex="-1">Setup Wireguard di VPS <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#setup-wireguard-di-vps">#</a></h2><p>Karena <code>wg</code> (binary dari wireguard) ternyata belum ada di dalam OpenBSD, maka perlu memasangnya secara manual. Sebelum itu ada beberapa hal yang perlu ane catat yaitu VPS ane sudah memakai <a href="https://www.openbsd.org/78.html">OpenBSD 7.8</a> dengan spesifikasi 1vCPU - 1GB RAM - 25GB SSD dan akan login dengan user bukan root sehingga ane akan pakai <code>doas</code> untuk elevasi ke root.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pkg_add wireguard-tools</span></span>
</code></pre><p>perintah ini akan memasang <code>wireguard-tools</code> yang akan menyediakan binari <code>wg</code> dan <code>wg-quick</code>. tapi ane akan pakai <code>wg</code> saja. <code>wg-quick</code> emang mantap untuk membuat akses wireguard secara cepat, namun ane ingin belajar jadi akan membangunnya dari nol.</p><h3 id="buat-key" tabindex="-1">Buat key <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#buat-key">#</a></h3><p>Setelah terpasang, langkah selanjutnya adalah membuat direktori khusus yang akan berisi berkas konfigurasi dari wireguard. Ini opsional, berkas wireguard bisa saja ditaruh dimana terserah tapi ane ikuti dulu panduan yang sudah ada dan jamak. Di dalam direktori <code>/etc/wireguard</code>, ane akan buat 2 buah key yang diperlukan untuk authentication server wireguard nantinya.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas mkdir -p /etc/wireguard</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cd /etc/wireguard</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas wg genkey | doas tee private.key | doas wg pubkey &gt; public.key</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cat private.key</span></span>
<span class="token output">QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
</span><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">cat public.key</span></span>
<span class="token output">dbXB+Cue2VpYBIjaTYneGgNglJHdgylriDkb014v6nI=
</span></code></pre><aside>Ada alternatif lain yang menurut ane lebih mudah untuk meng-generate private dan public key, yaitu dengan memanfaatkan layanan online dari web <a href="https://wgquick.com/">wgquick</a>.</aside><p>Catat hasil dari <code>private.key</code> dan <code>public.key</code> karena ini nanti penting untuk konfigurasi.</p><h3 id="buat-konfigurasi-untuk-wireguard" tabindex="-1">Buat konfigurasi untuk Wireguard <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#buat-konfigurasi-untuk-wireguard">#</a></h3><div class="postnotes kuning-gading"><p>Di OpenBSD ada 2 cara untuk mengatur interface <code>wg0</code> yang pertama adalah mempergunakan konfigurasi resmi dari Wireguard dan yang kedua mempergunakan metode asli khas OpenBSD.</p><p>Kelebihan dari metode pertama adalah standar Wireguard bisa langsung diaplikasikan kalo migrasi ke OS yang lain, sedangkan yang kedua karena konfigurasi standar dari OpenBSD sehingga bagi yang sudah terbiasa akan menjadi mudah dan familiar</p></div><h4 id="cara-pertama" tabindex="-1">Cara pertama <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#cara-pertama">#</a></h4><p>Masih di direktori <code>/etc/wireguard</code>, ane akan buat berkas konfigurasi wireguard yang akan digunakan untuk mengatur koneksi antara server dan client yaitu <code>wg0.conf</code></p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim wg0.conf</span></span>
<span class="token output">[Interface]
PrivateKey = QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
ListenPort = 51820

[Peer]
PublicKey = &lt;kosongin dulu nanti diisi publickey dari klien&gt;
AllowedIPs = 10.0.0.2/32
</span></code></pre><div class="postnotes pink"><p>Perhatikan <code>AllowedIPs</code> memakai <code>/32</code> yang artinya hanya punya range 1 IP saja. Ini penting agar bisa terhubung dengan baik, karena jika memakai <i>class</i> lainnya seperti <code>/24</code> tidak akan bisa terhubung. Wireguard bingung menentukan <em>point to point tunnel</em>.</p></div><p>Untuk <code>PrivateKey</code>, diisi dengan isi dari berkas <code>PrivateKey</code> yang sudah dibuat sebelumnya (yang tadi sudah dicatat. Sudah dicatat kan?). Sedangkan <code>PublicKey</code> nanti diisi dengan publickey yang akan dibuat diklien.</p><p>untuk interface, buat file baru dengan nama <code>hostname.wg0</code> di direktori <code>/etc</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /etc/hostname.wg0</span></span>
<span class="token output">inet 10.0.0.1 255.255.255.0
!/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf
up
</span></code></pre><p>Perhatikan baris kode <code>!/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf</code>, perintah ini akan memanggil konfigurasi Wireguard di <code>/etc/wireguard/wg0.conf</code> dan akan membacanya saat interface <code>wg0</code> diaktifkan.</p><hr><p>Pengaturan <code>Interface</code> di FreeBSD bisa saja memakai cara yg sama di atas namun biasanya ada 2 cara lain yang bisa di pakai yaitu melalui <code>wg0.conf</code> dan <code>rc.conf</code>.</p><p>Dengan <code>wg0.conf</code> adalah menambahkan keterangan tentang IP (dan MTU) langsung ke dalam file <code>wg0.conf</code> sehingga menjadi seperti ini</p><pre class="language-txt" tabindex="0"><code class="language-txt">[Interface]
Address = 10.0.0.1/24
MTU = 1420
</code></pre><p>Penulisan <em>netmask</em> (<code>/24</code>) ini sangat penting karena FreeBSD sejak versi 14.2 tidak mengijinkan penulisan IP tanpa <em>netmask</em> maka jika terlewat Wireguard akan menolak untuk <em>start</em>. Namun kadang kala konfigurasi netmask ini tiba - tiba hilang, bisa karena sistem atau <em>service</em> Wireguard <em>reboot</em> sehingga harus kembali menambahkan secara manual. Jika dirasa merepotkan maka mengatur hal ini di file <code>rc.conf</code> adalah pilihan yang lebih baik.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc cloned_interfaces+="wg0"</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysrc ifconfig_wg0="inet 10.0.0.1/24 mtu 1420 up"</span></span>
</code></pre><p>Jika pakai cara ini, maka konfigurasi <code>Address</code> dan <code>MTU</code> harus dihapus dari file <code>wg0.conf</code>.</p><hr><h4 id="cara-kedua" tabindex="-1">Cara kedua <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#cara-kedua">#</a></h4><p>Untuk cara yang kedua adalah membuat konfigurasi dengan metode tradisional OpenBSD. Untuk interface, buat file baru dengan nama <code>hostname.wg0</code> di direktori <code>/etc</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /etc/hostname.wg0</span></span>
<span class="token output">wgkey QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
wgport 51820
wgpeer &lt;kosongin dulu nanti diisi publickey dari klien&gt; wgaip 10.0.0.2/32
inet 10.0.0.1 255.255.255.0
up
</span></code></pre><p>Jika memakai cara yang ini tidak perlu membuat file konfigurasi <code>/etc/wireguard/wg0.conf</code>. Apapun cara yang dipilih, sementara biarin dulu seperti ini, ane akan atur wireguard di klien terlebih dahulu.</p><h4 id="catatan-untuk-freebsd" tabindex="-1">Catatan untuk FreeBSD <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#catatan-untuk-freebsd">#</a></h4><p>Jika pakai <a href="https://kusaeni.com/tags/freebsd">#FreeBSD</a> maka sebaiknya pakai cara yang pertama yaitu dengan membuat <em>file</em> konfigurasi <code>/usr/local/etc/wireguard/wg0.conf</code>. Isinya mirip dan prosesnya juga sama dengan OpenBSD.</p><h2 id="wireguard-client-di-macos" tabindex="-1">Wireguard Client di macos <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#wireguard-client-di-macos">#</a></h2><p>Ane pakai aplikasi #WireGuard resmi dari Wireguard. Kemudian membuat dan mengatur tunnel kosong baru (lihat gambar).</p><p><img alt="wireguard add tunnel" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/OpenBSD_Wireguard/SCR-20251129-qxxr__wylSLRT7.png?updatedAt=1764419428366"></p><aside class="image"><ul><li><b>No. 1</b> adalah public key dari klien yang nantinya akan di masukkan ke dalam wg0.conf peer publickey yang sebelumnya sudah ane buat.</li><li><b>No. 2</b> diisi dengan isian dari public.key wireguard di VPS yang sebelumnya sudah dibuat.</li><li><b>No. 3</b> adalah IP dari VPS dan port dari wireguard.</li></ul></aside><div class="postnotes"><h4>Opsional tapi kadang penting</h4><p>Untuk blok <code>[Interface]</code> kadang perlu memasukkan <code>Address</code> dari <code>wgaip</code> di konfigurasi (dalam hal ini <code>10.0.0.1/32</code>)</p><p>Untuk block <code>[Peer]</code> sangat disarankan untuk menambahkan <code>PersistentKeepalive = 25</code> untuk menjaga koneksi tetap terjaga/terhubung dengan baik.</p><p>Selain itu mengaktifkan <b>Exclude Private IP's</b> akan membuat sistem tetap bisa mengakses jaringan lokal (seperti NAS, LAN, dsb) <em>split tunnel</em> saat terhubung ke Wireguard. Mengaktifkan ini sangat direkomendasikan.</p></div><div class="postnotes pink"><h4>Wireguard sudah terhubung tapi <mark>tidak bisa akses situs tertentu</mark>?</h4><p>Tersangkanya jelas MTU atau Maximum Transmission Unit.</p><p>Biasanya sistem akan mengatur MTU secara otomatis, namun untuk beberapa OS tidak mengaturnya di nilai yang sama. Jadi jika di VPS (<i>host</i>) sudah diatur secara manual (misalnya ke nilai 1392) maka di klien harus memakai MTU yang sama. Caranya adalah menambahkan <code>MTU=1392</code> ke dalam blok <code>[Interface]</code>.</p><h4>Tapi bagaimana cara menentukan MTU yang pas untuk wireguard?</h4><p>Ada aplikasi yang bagus untuk membantu menentukan MTU yang sesuai dan optimal, nama aplikasinya <a href="https://github.com/yeya/wire-seek">wire-seek</a>.</p><p>Unduh saja aplikasi ini, sesuaikan dengan OS yang dipakai (ane sesuaikan dengan OS di klien yaitu MacOS). Kemudian jalankan di Terminal/CLI dengan perintah:</p><pre class="language-bash" tabindex="0">  <code class="language-bash">
       ➜ ./wire-seek-darwin-arm64 <span class="token parameter variable">--tunnel</span> <span class="token number">10.0</span>.0.1
       Wire-Seek: WireGuard MTU Optimizer
       Target: <span class="token number">10.0</span>.0.1<span class="token punctuation">(</span><span class="token number">10.0</span>.0.1<span class="token punctuation">)</span>
       Protocol: IPv4
       Discovering path MTU <span class="token punctuation">(</span>range: <span class="token number">576</span>-1500<span class="token punctuation">)</span><span class="token punctuation">..</span>.
       Results:
         Path MTU: <span class="token number">1500</span> bytes
         WireGuard MTU: <span class="token number">1500</span> bytes
       Add to your WireGuard config:
         MTU <span class="token operator">=</span> <span class="token number">1500</span>
    </code>
    </pre><p>Dengan catatan, perintah ini dijalankan saat klien sudah terhubung dengan server Wireguard. IP <code>10.0.0.1</code> adalah IP server Wireguard (bisa diganti dengan IP endpoint namun hapus flag <code>--tunnel</code>). Hasilnya adalah MTU dengan nilai <code>1500</code>, nilai ini kemudian ane masukkan di file konfigurasi <code>wg0.conf</code> di server maupun di klien.</p><p>Namun banyak rekomendasi untuk mengurangi nilai MTU sebanyak 8 <i>bytes</i> untuk <i>header</i>, sehingga nilai MTU menjadi <code>1492</code>. Namun ane memilih nilai MTU di <code>1420</code> karena di nilai ini saya tidak mengalami banyak masalah dalam membuka situs.</p></div><p>Simpan dan kembali ke pengaturan wireguard di VPS.</p><h2 id="finishing-wireguard-di-vps" tabindex="-1">Finishing WireGuard di VPS <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#finishing-wireguard-di-vps">#</a></h2><p>Apapun pilihan jenis konfigurasi WireGuard, setelah mendapatkan <code>public key</code> dari klien (dalam hal ini <code>DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=</code>) maka bisa dimasukkan ke dalam <code>wg0.conf</code> atau di <code>hostname.wg0</code> di bagian peer publickey.</p><p>Maka isian dari <code>/etc/wireguard/wg0.conf</code> akan seperti ini:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /etc/wireguard/wg0.conf</span></span>
<span class="token output">[Interface]
PrivateKey = QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
ListenPort = 51820

[Peer]
PublicKey = DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=
AllowedIPs = 10.0.0.2/32
</span></code></pre><p>atau <code>/etc/hostname.wg0</code>:</p><pre class="language-txt" tabindex="0"><code class="language-txt">wgkey QJqx4o8lsM1eZb2u+t4yRctEkjALq2GFJgimdkTphHc=
wgport 51820
wgpeer DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w= wgaip 10.0.0.2/32
inet 10.0.0.1 255.255.255.0
up
</code></pre><p>Selanjutnya adalah mengatur aliran data untuk mengalihkan paket wireguard ke interface <code>wg0</code>.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sysctl net.inet.ip.forwarding=1</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas echo "net.inet.ip.forwarding=1" &gt;&gt; /etc/sysctl.conf</span></span>
</code></pre><p>Tidak cukup ini saja, perlu juga mengatur firewall di <code>pf.conf</code>. Ane cukup pusing disini dan butuh waktu yang lama agar bisa berjalan.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas vim /etc/pf.conf</span></span>
<span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">Set MTU</span></span>
<span class="token output">match on wg0 scrub (max-mss 1352)

</span><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">Wireguard</span></span>
<span class="token output">pass in on egress proto udp from any to any port 51820
pass in on wg0
pass out on egress
pass from 10.0.0.0/24 to any
match out on egress from 10.0.0.0/24 to any nat-to (egress)

</span><span class="token command"><span class="token shell-symbol important">#</span> <span class="token bash language-bash">SSH</span></span>
<span class="token output">pass in quick on egress proto tcp from any to (egress) port 22
</span></code></pre><p>Tes <em>firewall</em> jika tidak ada masalah langsung aktifkan.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -nf /etc/pf.conf</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas pfctl -f /etc/pf.conf</span></span>
</code></pre><p>Aktifkan wireguard <em>network interface</em> dan cek statusnya.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas sh /etc/netstart wg0</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">doas wg show</span></span>
<span class="token output">interface: wg0
public key: dbXB+Cue2VpYBIjaTYneGgNglJHdgylriDkb014v6nI=
 private key: (hidden)
 listening port: 5

peer: DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=
  endpoint: 103.102.101.100:5976
  allowed ips: 10.0.0.2/32
</span></code></pre><p>di bagian peer tidak ada keterangan <em>handshake</em> menandakan bahwa klien belum terhubung. Hubungkan klien di aplikasi wireguard dan seharusnya di bagian peer menjadi seperti ini:</p><pre class="language-txt" tabindex="0"><code class="language-txt">peer: DQ/kSnXwMGIRmF/40wQhCWCrNe7k4V6zb3Jo92Y3s3w=
  endpoint: 103.102.101.100:5976
  allowed ips: 10.0.0.2/32
  latest handshake: 10 seconds ago
  transfer: 1 MiB received, 2 Mib sent
</code></pre><p>kemudian cek akses internet di klien dan cek IP dengan mengunjungi situs <a href="https://ipleak.net/">ipleak</a> seharusnya lokasi dan IPnya sudah sesuai dengan IP dan lokasi VPS.</p><p><img alt="ipleak" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/OpenBSD_Wireguard/SCR-20260126-scih_2w-URN1ny.png"></p><div class="postnotes"><h5>Update</h5><p>Untuk menambahkan <code>peer</code> baru, sila mengulangi proses <a href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#wireguard-di-vps-1">ini</a>. Kemudian restart ulang interface wireguard, dan cek lagi dengan menjalankan perintah <code>doas wg show</code>. Jika setelah dicek masih ada <code>peer</code> yang lama atau yang baru dimasukkan tidak terlihat, maka coba untuk menghapus interface <code>wg0</code> dan mengaktifkan ulang.</p><pre class="language-none" tabindex="0"><code class="language-none">
$ doas ifconfig wg0 destroy
$ doas sh /etc/netstart wg0
$ doas wg show
</code></pre><p>Seharusnya data <code>peer</code> sudah diperbarui.</p></div><div class="terkait full"><span class="ter">Artikel Terkait</span><div class="kait"><h4><a class="hRelasi" href="https://kusaeni.com/jurnal/openbsd-unbound/">Unbound di OpenBSD</a></h4><p>Unbound adalah DNS resolver caching recursive yang open-source, ringan, dan secure. Tapi dia punya kemampuan lain yaitu memblokir iklan yang menjengkelkan. Sempurna untuk digabung dengan Wireguard.</p></div></div><h4 id="killswitch" tabindex="-1">Killswitch <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#killswitch">#</a></h4><p>Killswitch adalah fitur keamanan yang sekarang sepertinya sudah menjadi standar untuk layanan VPN. Fungsinya adalah memutus akses internet saat VPN terputus sehingga tidak ada kebocoroan (<em>data leak</em>) berupa IP, DNS, atau data lainnya yang terkait. Hampir semua aplikasi VPN sudah menyediakan fitur ini.</p><p>Namun karena ane buat VPN secara mandiri, maka ane hanya pakai aplikasi resmi dari wireguard yang sangat minimalis dan tidak banyak fitur tersedia termasuk killswitch. Karena MacOs sendiri adalah bagian dari keluarga BSD, maka tentu saja MacOs memiliki atau mempergunakan firewall <a href="https://www.openbsd.org/faq/pf/">PF</a>, sehingga bisa dimanfaatkan untuk membuat mode killswitch sendiri.</p><p>Inti dari killswitch ini adalah memutus akses keluar masuk saat tidak sedang terhubung ke VPN, script pf sederhananya sebagai berikut</p><pre class="language-txt" tabindex="0"><code class="language-txt">vpn_ip = '103.102.101.100'
vpn_port = '5128'

set skip on lo0

# block semua akses keluar
block drop out all

# ijinkan akses ke wireguard saja
pass out proto udp from any $vpn_ip to any port $vpn_port
pass on utun4 all
</code></pre><aside>Simpan sebagai misalnya <code>.pf_killswitch.conf</code> dan taruh di home directory. Tanda titik sebelum nama file berarti membuat file menjadi tersembunyi atau <i>hidden</i></aside><p>Saat diaktifkan perintah ini akan memblokir semua akses keluar kecuali akses ke wireguard dan akses ke interface <code>utun4</code>.</p><div class="postnotes kuning-gading"><p>Di mac ane, akses wireguard mempergunakan interface <code>utun4</code>. Sesuaikan dengan interface yang digunakan oleh wireguard di sistem ente.</p></div><p>Cara pakainya adalah, saat VPN sudah terhubung, jalankan perintah berikut:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo pfctl -fa ~/.pf_killswitch.conf -e</span></span>
</code></pre><p>Saat sudah tidak memakai VPN, pf ini harus dimatikan supaya tidak memblokir akses internet yang lain. Jalankan perintah berikut:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo pfctl -d</span></span>
</code></pre><p>Jika punya pengaturan pf yang lain, maka jangan lupa aktifkan kembali pengaturan pf asli dari Macos dengan perintah berikut:</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo pfctl -f /etc/pf.conf -e</span></span>
</code></pre><p>Cukup merepotkan bukan? Tapi diluar sana tidak hanya ane yang repot, sehingga ada seseorang yang kemudian membuat script untuk memudahkan proses ini. Namanya killswitch dari <a href="https://github.com/vpn-kill-switch/killswitch">github</a> - <a href="https://vpn-kill-switch.com/">https://vpn-kill-switch.com/</a>. Cara pasangnya mudah sekali, dibantu oleh <a href="https://brew.sh/">homebrew</a> dan cara pakainya seperti ini</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">brew install killswitch</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo killswitch -e</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo killswitch -d</span></span>
</code></pre><aside><ul><li>Flag <code>-e</code> untuk mengaktifkan killswitch</li><li>Flag <code>-d</code> untuk menonaktifkan killswitch</li></ul></aside><p>Sedangkan perintah killswitch sendiri akan menghasilkan informasi terkait interface tersedia dan public IP address yang digunakan oleh VPN.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo killswitch</span></span>
<span class="token output">Interface  MAC address         IP
en0        76:61:a8:f1:ex:1O   172.20.10.2/16
utun4                          10.0.0.2

Public IP address: 103.102.101.100
PEER IP address:   &lt;nil&gt;

To enable the kill switch run: sudo killswitch -e
To disable: sudo killswitch -d
</span></code></pre><p>seperti contoh di atas adalah informasi setelah VPN terhubung, masalahnya adalah di <code>PEER IP address:   &lt;nil&gt;</code> ini karena killswitch tidak bisa menemukan IP dari Endpoint VPN, bug yang memang muncul jika pakai MacOS. Sehingga saat killswitch dijalankan dia akan bikin semua akses internet terblokir meski sudah terhubung ke VPN.</p><p>Jadi agar killswitch bisa mengerti <code>PEER IP address</code>, maka perlu menambahkan flag <code>-ip</code> untuk menentukan IP address dari Endpoint VPN.</p><pre class="language-shell-session" tabindex="0"><code class="language-shell-session"><span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo killswitch -e -ip 103.102.101.100</span></span>
<span class="token command"><span class="token shell-symbol important">$</span> <span class="token bash language-bash">sudo killswitch</span></span>
<span class="token output">Interface  MAC address         IP
en0        76:61:a8:f1:ex:1O   172.20.10.2/16
utun4                          10.0.0.2

Public IP address: 103.102.101.100
PEER IP address:   103.102.101.100

To enable the kill switch run: sudo killswitch -e
To disable: sudo killswitch -d
</span></code></pre><p>dan dengan ini killswitch akan menandai akses ke IP Address VPN dan mengaktifkan pf, jika VPN terputus maka killswitch akan memblokir semua akses internet yang meningkatkan keamanan dan privasi pengguna.Jangan lupa mematikan killswitch jika sedang tidak memakai VPN, agar tidak repot ketik perintah manual di terminal gunakan Shortcuts app untuk membuat shortcut.</p><p>Mempergunakan Shortcuts app memiliki satu masalah yaitu akan membuka terminal setiap kali <em>shortcut</em> dijalankan. Jika pernah dijalankan misalnya 100 kali, maka di perintah ke 101 akan membuka terminal sebanyak 100 jendela. Ini sangat menganggu meski nantinya jendela - jendela tersebut akan menghilang setelah perintah selesai diproses.</p><p>Untuk itu ane gunakan cara lain yaitu dengan mempergunakan aplikasi kecil lainnya yang bernama <a href="https://www.hammerspoon.org/">Hammerspoon</a>. Setelah terpasang, cara pengaturannya adalah dengan membuat <em>file</em> <code>~/.hammerspoon/init.lua</code>. Iya Hammerspoon pakai Lua untuk pengaturannya, memang sedikit repot tapi kalo paham Lua maka ini membuat Hammerspoon sangat fleksibel.</p><pre class="language-lua" tabindex="0"><code class="language-lua">local wg_server = "103.102.101.100"
local anybarPort = "1738"

local function updateAnyBar(color)
    hs.execute('echo -n "' .. color .. '" | nc -4u -w0 localhost ' .. anybarPort, true)
end

local function sudoPoes(command, successColor, successMsg)
    local _, status = hs.execute("sudo " .. command, true)
    if status then
        updateAnyBar(successColor)
        hs.alert.show(successMsg, 2)
    end
end

-- Hotkeys
hs.hotkey.bind({"alt", "cmd"}, "9", function()
    sudoPoes("killswitch -e -ip " .. wg_server, "red", "Killswitch Aktif")
end)

hs.hotkey.bind({"alt", "cmd"}, "0", function()
    sudoPoes("killswitch -d", "green", "Killswitch Berhenti")
end)
</code></pre><p>Setelah disimpan dan <em>reload config</em>, maka jika menekan tombol <code>⌥ + ⌘ + 9</code> akan mengaktifkan perintah pengaktifan <code>killswitch</code>, setelah perintah aktif maka Hammerspoon juga akan mengirimkan sinyal ke AnyBar sebagai indikator di <em>menubar</em> dengan warna merah saat aktif dan hijau saat tidak aktif.</p><iframe allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" src="https://imagekit.io/player/embed/hjse9uhdjqd/jurnal/OpenBSD_Wireguard/hammerspoon_killswitch_mW_N6PGNg.mp4?controls=true&amp;autoplay=false&amp;loop=false&amp;background=%23000000&amp;thumbnail=https%3A%2F%2Fik.imagekit.io%2Fhjse9uhdjqd%2Fjurnal%2FOpenBSD_Wireguard%2Fhammerspoon_killswitch_mW_N6PGNg.mp4%2Fik-thumbnail.jpg%3FupdatedAt%3D1770342444842" title="ImageKit video player" class="video" frameborder="0"></iframe><p>Scripts Hammerspoon di atas, khusus untuk aktifkan <code>killswitch</code> hanya bisa dijalankan saat wireguard sudah tersambung. Jika belum maka tidak akan menghasilkan apa - apa karena ane set IP wireguard langsung <em>hard coded</em> di dalam <em>scripts</em>. Peningkatan <em>scripts</em> ke depannya mungkin saat <code>⌥ + ⌘ + 9</code> ditekan maka secara otomatis memeriksa apakah wireguard sudah aktif atau belum. Jika sudah maka langsung aktifkan <code>killswitch</code> namun jika belum maka harus hubungkan wireguard terlebih dahulu.</p><p>Tentu saja <a href="https://github.com/tonsky/AnyBar">AnyBar</a> ini opsional, boleh tidak dipakai namun ane pasang karena membantu memberikan visual apakah <code>killswitch</code> sedang aktif atau tidak.</p><h4 id="dengan-aplikasi" tabindex="-1">Dengan aplikasi <a class="header-anchor" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/#dengan-aplikasi">#</a></h4><p><img alt="Lulu Block Mode, harus manual mengakses menu ini untuk mengaktifkan block mode" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/OpenBSD_Wireguard/SCR-20260111-mcap_Z9pGFTPUD.png"></p><aside class="image">Butuh waktu dan beberapa klik untuk bisa mengaktifkan block mode ini, meski bisa diatur dengan bantuan shortcut misalnya, tapi ane belum pernah coba</aside><p>Ada beberapa aplikasi yang bisa digunakan sebagai alternatif killswitch seperti <a href="https://www.obdev.at/products/littlesnitch/index.html">Little Snitch</a> atau <a href="https://objective-see.org/products/lulu.html">Lulu</a>. Dari kedua ini Little Snitch lebih bagus dan mudah namun memang aplikasi berbayar, sedangkan Lulu gratis namun kurang fleksibel dan masih memerlukan campur tangan user (manual aktifkan rules.)</p><p>Aplikasi gratis lain yang bisa dipakai adalah Mirham KillSwitch, yang bisa diunduh dari <a href="https://github.com/mirham/KillSwitch">sini</a>. Aplikasi ini akan menaruh ikon di menubar dan tinggal klik untuk memakainya.</p><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/openbsd">#openbsd</a></h4><div class="related_post_list"><span class="related_post_date">29 Nov 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/openbsd-install-wireguard/"> <h4>Wireguard di OpenBSD</h4></a><p class="post_ringkasan">Catatan ane tentang memasang Wireguard di OpenBSD, yang katanya mudah tapi cukup bikin pusing juga</p></div><div class="related_post_list"><span class="related_post_date">06 Des 2024</span><a class="related_post_link" href="https://kusaeni.com/jurnal/menginstall-openbsd-di-vps-linux/"> <h4>Menginstall OpenBSD di VPS berbasis Linux</h4></a><p class="post_ringkasan">Provider tidak menyediakan OS OpenBSD dan atau ingin menginstall sendiri?</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KB7AAT2X97B5D49DADYPP5KS">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KB7AAT2X97B5D49DADYPP5KS"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Meng-upload ebook ke Kindle dengan Ko Reader SSH Server</title>
      <link>https://kusaeni.com/jurnal/kindle-upload-epub-ko-reader/</link>
      <guid isPermaLink="false">https://kusaeni.com/jurnal/kindle-upload-epub-ko-reader/</guid>
      <content:encoded>
        <![CDATA[<p>Memakai kindle yg sudah di<a href="https://kusaeni.com/jurnal/jailbreak-kindle/">jailbreak</a> dan install Ko Reader, salah satu halangan yang ane rasakan adalah saat mengunggah file ebook. Normalnya ane pakai kabel data untuk transfer file namun untuk bisa melakukan ini harus mematikan Ko Reader dan balik ke OS Kindle.</p><p>Sebenarnya Ko Reader sudah menyediakan fitur untuk kirim file tanpa harus kembali ke Kindle OS. Cara yang paling mudah bagi ane saat ini adalah dengan fungsi SSH. Berikut cara ane untuk terkoneksi antara komputer (Mac) dan Ko Reader (Kindle) dengan akses SSH alias <em>Secure Shell</em>.</p><p>Tentu saja untuk bisa terhubung maka antara Kindle dan komputer harus dalam jaringan yang sama, untuk ini ane pakai <em>tethering</em> dari ponsel. Setelah terhubung maka pembagian IP-nya sebagai berikut:</p><table><thead><tr><th>Nama Perangkat</th><th>IP</th><th>Role</th></tr></thead><tbody><tr><td>Ponsel</td><td>172.20.10.1</td><td>Gateway</td></tr><tr><td>Kindle</td><td>172.20.10.4</td><td>Client</td></tr><tr><td>Komputer (Mac)</td><td>172.20.10.2</td><td>Client</td></tr></tbody></table><p>Sebelum itu tentu harus mengatur agar Kindle (mode Ko Reader) terhubung ke WiFi Ponsel. Usap ke bawah pada bagian atas layar Kindle kemudian pilih icon <em>Gear</em> dan kemudian pilih <em>Network</em> dan beri centang pada <em>Wi-Fi Connection</em> kemudian pilih dan masukkan <em>password</em> pada SSID WiFi Ponsel. Setelah tersambung akan muncul informasi terkait jaringan.</p><p>Kemudian di menu yang sama pilih <em>SSH Server</em> akan muncul menu baru dan tekan beri centang pada <code>Login without password (DANGEROUS)</code>. Sementara tidak pakai <em>password</em> dulu karena ane pelupa. Setelah itu baru kasih centang pada <em>SSH Server</em> dan catat <em>port</em>-nya (dalam hal ini punya ane di <em>port</em> <code>2222</code>.</p><p><img alt="Ko Reader: pengaturan SSH Server" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/kindle/Reader_The%20Name%20of%20the%20Rose%20--%20Eco,%20Umberto%20--%202010%20--%20Harcourt%20Trade%20Publishers%20--%20c9a92ab81d76e2cab9f8c5e8053a07ff%20--%20Anna_s%20Archive.epub_p92_2025-11-16_104435_8WAlLNfcy.png"></p><p>Maka <em>server SSH</em> sudah tersedia dan bisa diakses melalui IP dan <em>port</em> yang sudah ditentukan, bisa pakai CLI/Terminal atau dengan <em>File Manager</em>. Ane pilih yang kedua dan pakai Nimble Commander karena punya 2 panel terpisah dalam 1 jendela aplikasi. Di Nimble SSH bisa diakses dengan SFTP atau <em>Secure File Transfer Protocol</em>. Konfigurasi melibatkan alamat IP tujuan, <em>username</em>, <em>password</em> dan <em>port</em>.</p><p>Nimble tidak mengijinkan pengaturan SFTP tanpa <em>password</em> tapi di pengaturan Ko Reader sudah diatur tanpa <em>password</em>, maka apapun <em>password</em> yang ane masukkan akan diabaikan oleh Ko Reader.</p><p><img alt="Nimble Commander: setup SFTP ke Ko Reader" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/kindle/SCR-20251116-rwzy_nxtACN6tM.png"></p><p>Setelah terhubung, <em>default</em>-nya akan terbuka <code>/var/tmp</code> <em>directory</em>. Tujulah <em>directory</em> <code>//172.20.10.4/mnt/us/</code>. Dalam pengaturan Ko Reader ane simpan semua buku di <em>folder</em> <code>Buku</code>. Sehingga ane tinggal <em>copy - paste</em> ke dalam <em>folder</em> ini. Semua dilakukan melalui Nimble Commander.</p><p><img alt="Nimble: Copy paste ebook ke dalam folder Buku di Ko Reader/Kindle" src="https://ik.imagekit.io/hjse9uhdjqd/jurnal/kindle/SCR-20251116-rwmm_K5XwcW7DQ.png?updatedAt=1763300984284"></p><p>Cara yang lainnya adalah dengan mempergunakan <em>authorized_keys</em> yaitu dengan cara mengirim SSH Key ke Kindle dan kemudian bisa login lewat SSH tanpa <em>password</em>. Metode ini membuat koneksi menjadi sangat aman, namun ane cukup dengan model SSH (pakai SFTP) seperti sebelumnya.</p><p>Setelah selesai jangan lupa untuk mematikan <em>SSH Server</em> dan <em>disconnect</em> dari WiFi (untuk mengindari Kindle mendownload <em>firmware</em> yang bisa membuat <em>jailbreak</em> gagal berfungsi.)</p><hr><div id="related_post"><h4 style="margin:0 0 1em;padding:0">Artikel terkait <a href="https://kusaeni.com/tags/kindle">#kindle</a></h4><div class="related_post_list"><span class="related_post_date">26 Jun 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/jailbreak-kindle/"> <h4>Jailbreak Kindle</h4></a><p class="post_ringkasan">supaya bisa sideload ebook dan aman.</p></div><div class="related_post_list"><span class="related_post_date">15 Jun 2025</span><a class="related_post_link" href="https://kusaeni.com/jurnal/kena-tipu/"> <h4>Kena tipu</h4></a><p class="post_ringkasan">Beli barang di facebook marketplace, malah kena tipu. Jangan pernah mau beli barang dengan rekber KiriminAja!</p></div></div><hr><div id="dropcomments-container"></div><div class="comments-section"><header class="comments-header"><h4>dari Fediverse</h4><p>Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-<i>reply</i> <a href="https://sok.egois.org/@poes/statuses/01KA6FYHCK2BQCK04WH1T6XD0N">di toot ini</a></p></header><mastodon-comments cache="60" class="comments" src="https://sepoi.deno.dev/@poes/statuses/01KA6FYHCK2BQCK04WH1T6XD0N"> Belum ada komentar dari fediverse </mastodon-comments></div>]]>
      </content:encoded>
      <pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>