<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Mr koala</title>
    <description>The latest articles on Forem by Mr koala (@mrkoala1001).</description>
    <link>https://forem.com/mrkoala1001</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3729288%2F08018598-ac61-451a-bb0e-73ac0573f353.png</url>
      <title>Forem: Mr koala</title>
      <link>https://forem.com/mrkoala1001</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mrkoala1001"/>
    <language>en</language>
    <item>
      <title>🛡️ Hardening VPS Ubuntu: Mengunci Pintu dari Serangan Botnet</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Thu, 12 Mar 2026 21:10:28 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/hardening-vps-ubuntu-mengunci-pintu-dari-serangan-botnet-1k6a</link>
      <guid>https://forem.com/mrkoala1001/hardening-vps-ubuntu-mengunci-pintu-dari-serangan-botnet-1k6a</guid>
      <description>&lt;p&gt;Pernah cek log server dan kaget lihat ribuan IP asing mencoba login? Itu adalah Botnet Brute Force. Jika dibiarkan, servermu tinggal menunggu waktu untuk jebol. Berikut adalah panduan praktis untuk memperkuat keamanan VPS Ubuntu kamu.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Siapkan "Pagar" dengan UFW (Uncomplicated Firewall)
Tanpa firewall, semua port di servermu terekspos. Kita hanya akan membuka pintu yang benar-benar diperlukan oleh aplikasi Laravel dan sistem billing/radius kamu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Langkah-langkah:&lt;br&gt;
Bash&lt;/p&gt;

&lt;h1&gt;
  
  
  Izinkan Traffic Web (HTTP &amp;amp; HTTPS)
&lt;/h1&gt;

&lt;p&gt;sudo ufw allow 80/tcp&lt;br&gt;
sudo ufw allow 443/tcp&lt;/p&gt;

&lt;h1&gt;
  
  
  Izinkan SSH (Pintu Masuk Admin)
&lt;/h1&gt;

&lt;p&gt;sudo ufw allow 22/tcp&lt;/p&gt;

&lt;h1&gt;
  
  
  Izinkan FreeRadius (Port UDP untuk Hotspot/Billing)
&lt;/h1&gt;

&lt;p&gt;sudo ufw allow 1812/udp&lt;br&gt;
sudo ufw allow 1813/udp&lt;/p&gt;

&lt;h1&gt;
  
  
  Aktifkan Firewall
&lt;/h1&gt;

&lt;p&gt;sudo ufw enable&lt;br&gt;
Tips: Selalu cek status dengan sudo ufw status untuk memastikan tidak ada port database (3306) yang terbuka untuk umum.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pindahkan "Pintu Rahasia" (Ganti Port SSH)
Bot hacker biasanya hanya menyerang port standar 22. Dengan memindahkannya ke angka unik (misal: 2299), kamu membuat servermu "tidak terlihat" oleh 99% bot di internet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cara Eksekusi:&lt;br&gt;
Buka port baru di UFW: sudo ufw allow 2299/tcp&lt;/p&gt;

&lt;p&gt;Edit konfigurasi SSH: sudo nano /etc/ssh/sshd_config&lt;/p&gt;

&lt;p&gt;Ubah baris: Port 22 menjadi Port 2299&lt;/p&gt;

&lt;p&gt;Restart layanan: sudo systemctl restart ssh&lt;/p&gt;

&lt;p&gt;Hapus port lama: sudo ufw delete allow 22/tcp&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pasang "Satpam" Otomatis: Fail2Ban
Jika ada seseorang (atau robot) yang mencoba menebak password/fingerkey kamu berkali-kali, Fail2Ban akan otomatis memblokir IP mereka di level firewall.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instalasi:&lt;br&gt;
Bash&lt;br&gt;
sudo apt update&lt;br&gt;
sudo apt install fail2ban -y&lt;br&gt;
Secara default, Fail2Ban akan memantau SSH dan memblokir IP yang gagal login lebih dari 5 kali selama 10 menit. Ini sangat efektif untuk menghemat penggunaan CPU dari serangan sampah.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Monitoring: Siapa yang Mengetuk Pintumu?
Sebagai admin, kamu wajib tahu siapa yang mencoba masuk. Gunakan perintah sakti ini:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cek Percobaan Gagal (Maling):&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
lastb | head -n 20&lt;br&gt;
Cek Login Berhasil (Internal):&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
last | head -n 10&lt;br&gt;
Cek Koneksi Real-time:&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
netstat -antup&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Security Checklist untuk Laravel
Selain server, aplikasi Laravel-mu juga harus dijaga:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;APP_DEBUG=false: Pastikan ini di file .env saat production agar detail database tidak bocor saat error.&lt;/p&gt;

&lt;p&gt;Eloquent ORM: Selalu gunakan ini daripada Raw Query untuk mencegah SQL Injection.&lt;/p&gt;

&lt;p&gt;Update Berkala: Selalu jalankan sudo apt update &amp;amp;&amp;amp; sudo apt upgrade untuk menambal celah keamanan kernel.&lt;/p&gt;

&lt;p&gt;Kesimpulan&lt;br&gt;
Keamanan bukan tentang sekali setting lalu selesai, tapi tentang membangun kebiasaan. Dengan UFW + Custom Port + Fail2Ban, server kamu kini sudah jauh lebih tangguh menghadapi serangan di luar sana.&lt;/p&gt;

&lt;p&gt;Keep coding, stay secure! 🚀&lt;/p&gt;

&lt;p&gt;Diterbitkan oleh: Dedy - Koala Network Core v2&lt;br&gt;
Tags: #ubuntu #security #laravel #devops&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Antigravity server crashed unexpectedly. Please restart to fully restore AI features. (proxmox)</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Thu, 12 Mar 2026 16:01:09 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/antigravity-server-crashed-unexpectedly-please-restart-to-fully-restore-ai-features-proxmox-5a3e</link>
      <guid>https://forem.com/mrkoala1001/antigravity-server-crashed-unexpectedly-please-restart-to-fully-restore-ai-features-proxmox-5a3e</guid>
      <description>&lt;p&gt;I once had a problem with Antigravity.&lt;/p&gt;

&lt;p&gt;When I tried to connect Antigravity to my VPS, an error like the first image appeared.&lt;/p&gt;

&lt;p&gt;Antigravity successfully displayed, but the AI ​​agent couldn't be used. Please note, this VPS uses Proxmox.&lt;/p&gt;

&lt;p&gt;After searching for numerous tutorials online, I found a solution.&lt;/p&gt;

&lt;p&gt;The solution was to change the processor type in Proxmox to host.&lt;/p&gt;

&lt;p&gt;Hope this helps.&lt;/p&gt;

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

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

</description>
      <category>proxmox</category>
      <category>ssh</category>
      <category>remote</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>Memahami Arsitektur Web Modern: SPA, MPA, dan PWA</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Sun, 01 Mar 2026 19:36:28 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/memahami-arsitektur-web-modern-spa-mpa-dan-pwa-2b7e</link>
      <guid>https://forem.com/mrkoala1001/memahami-arsitektur-web-modern-spa-mpa-dan-pwa-2b7e</guid>
      <description>&lt;p&gt;Dalam dunia pengembangan web, memilih arsitektur yang tepat adalah langkah krusial sebelum memulai proyek. Seringkali kita mendengar istilah seperti SPA, MPA, dan PWA. Artikel ini akan membedah konsep-konsep tersebut agar Anda dapat menentukan mana yang paling sesuai untuk kebutuhan aplikasi Anda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MPA (Multi-Page Application)&lt;/strong&gt;&lt;br&gt;
MPA adalah pendekatan tradisional dalam membangun website. Setiap kali pengguna mengklik tautan, browser akan mengirimkan permintaan ke server dan server akan mengirimkan halaman HTML baru secara utuh.&lt;/p&gt;

&lt;p&gt;Cara Kerja: Setiap navigasi memicu pemuatan ulang halaman (full page reload).&lt;/p&gt;

&lt;p&gt;Kelebihan:&lt;br&gt;
SEO Friendly: Karena konten dirender di server, mesin pencari seperti Google dapat merayapi (crawling) halaman dengan sangat mudah.&lt;/p&gt;

&lt;p&gt;Keamanan: Logika bisnis tetap berada di sisi server.&lt;/p&gt;

&lt;p&gt;Kekurangan:&lt;br&gt;
Interaksi Lambat: Pengguna harus menunggu halaman dimuat ulang setiap kali berpindah menu.&lt;/p&gt;

&lt;p&gt;Beban Server: Server harus bekerja ekstra untuk merender HTML setiap saat.&lt;/p&gt;

&lt;p&gt;Contoh: Blog, toko online besar (Amazon versi lama), atau portal berita.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPA (Single Page Application)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SPA adalah aplikasi web yang hanya memuat satu halaman HTML tunggal. Interaksi selanjutnya ditangani secara dinamis menggunakan JavaScript tanpa perlu memuat ulang seluruh halaman.&lt;/p&gt;

&lt;p&gt;Cara Kerja: Saat pertama kali dibuka, browser mengunduh kerangka utama dan skrip JavaScript. Navigasi antar menu hanya mengubah konten di bagian tertentu menggunakan framework seperti React, Vue, atau Angular.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt;&lt;br&gt;
Pengalaman Pengguna (UX) Luar Biasa: Transisi terasa sangat cepat seperti aplikasi desktop atau mobile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hemat Bandwidth:&lt;/strong&gt; Setelah pemuatan awal, hanya data (biasanya dalam format JSON) yang dikirim bolak-balik antara klien dan server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kekurangan:&lt;/strong&gt;&lt;br&gt;
SEO Menantang: Karena konten dihasilkan secara dinamis oleh JS, bot mesin pencari terkadang kesulitan membaca isinya (meskipun sekarang sudah membaik).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initial Load:&lt;/strong&gt; Waktu pemuatan pertama kali biasanya lebih lama karena browser harus mengunduh file JavaScript yang besar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contoh:&lt;/strong&gt; Gmail, Facebook, Trello, dan Dashboard Admin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PWA (Progressive Web App)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PWA bukanlah framework&lt;/strong&gt;, melainkan metodologi atau standar untuk membuat aplikasi web memiliki kemampuan seperti aplikasi native (Android/iOS). PWA bisa dibangun di atas arsitektur SPA maupun MPA.&lt;/p&gt;

&lt;p&gt;Fitur Utama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installable: Bisa ditambahkan ke layar utama ponsel tanpa melalui App Store/Play Store.&lt;/li&gt;
&lt;li&gt;Offline Mode: Menggunakan Service Workers untuk menyimpan cache sehingga tetap bisa diakses tanpa internet.&lt;/li&gt;
&lt;li&gt;Push Notifications: Bisa mengirim notifikasi ke perangkat pengguna.&lt;/li&gt;
&lt;li&gt;Responsif: Tampilan yang menyesuaikan segala ukuran layar dengan sempurna.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt; Memberikan performa tinggi dan keterlibatan pengguna yang lebih baik tanpa biaya pengembangan aplikasi mobile yang mahal.&lt;br&gt;
Contoh: Twitter Lite, Starbucks, dan Pinterest.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Istilah Terkait: SSR dan SSG&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Untuk mengatasi kekurangan SEO pada SPA, muncul teknik rendering lainnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SSR (Server-Side Rendering)&lt;br&gt;
Konten dihasilkan di server setiap kali ada permintaan, tetapi setelah sampai di browser, ia berperilaku seperti SPA (sering disebut Universal atau Isomorphic JS).&lt;br&gt;
&lt;strong&gt;Framework Populer&lt;/strong&gt;: Next.js (React), Nuxt.js (Vue).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSG (Static Site Generation)&lt;br&gt;
Website dibuat menjadi file HTML statis pada saat proses build. Sangat cepat karena server hanya perlu mengirimkan file yang sudah jadi.&lt;br&gt;
&lt;strong&gt;Framework Populer:&lt;/strong&gt; Astro, Hugo, Gatsby.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kesimpulan: Pilih yang Mana?&lt;/strong&gt;&lt;/p&gt;

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

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>stats.vocherrealtime</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Sun, 15 Feb 2026 17:57:20 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/statsvocherrealtime-2g9l</link>
      <guid>https://forem.com/mrkoala1001/statsvocherrealtime-2g9l</guid>
      <description>&lt;p&gt;Fungsi &lt;strong&gt;stats.vocherrealtime&lt;/strong&gt; (yang di dalam kode tertulis sebagai &lt;code&gt;voucherRealtime&lt;/code&gt;) adalah bagian dari sistem statistik di dashboard untuk menghitung total pendapatan dari voucher hotspot yang dihasilkan.&lt;/p&gt;

&lt;p&gt;Berikut adalah penjelasan teknis mengenai cara kerjanya:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Sumber Data (Database)
&lt;/h2&gt;

&lt;p&gt;Data diambil dari tabel &lt;code&gt;billing_history&lt;/code&gt; (riwayat pembuatan/penjualan voucher) dan digabungkan (&lt;em&gt;join&lt;/em&gt;) dengan tabel &lt;code&gt;hotspot_profile_metadata&lt;/code&gt; (pengaturan harga per profil).&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Logika Perhitungan (Backend)
&lt;/h2&gt;

&lt;p&gt;Perhitungan ini dilakukan di dalam &lt;code&gt;DashboardController.php&lt;/code&gt; dengan logika sebagai berikut:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query SQL&lt;/strong&gt;&lt;br&gt;
Sistem menjumlahkan (&lt;code&gt;SUM&lt;/code&gt;) harga dari semua voucher milik user tersebut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Penentuan Harga&lt;/strong&gt;&lt;br&gt;
Menggunakan fungsi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COALESCE(pm.price, bh.price)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Artinya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jika ada harga terbaru yang diatur di menu Profile (&lt;code&gt;hotspot_profile_metadata&lt;/code&gt;), maka harga itulah yang dipakai.&lt;/li&gt;
&lt;li&gt;Jika tidak ada, sistem akan menggunakan harga yang tersimpan saat voucher pertama kali dibuat di &lt;code&gt;billing_history&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Tampilan di Dashboard (Frontend)
&lt;/h2&gt;

&lt;p&gt;Di file &lt;code&gt;dashboard.blade.php&lt;/code&gt;, data ini dikelola menggunakan AlpineJS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variabel &lt;code&gt;$voucherRealtime&lt;/code&gt; dari PHP dikirim ke objek JavaScript &lt;code&gt;stats&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fungsi &lt;code&gt;formatRupiah(stats.voucherRealtime)&lt;/code&gt; mengubah angka tersebut menjadi format mata uang IDR.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Sinkronisasi Real-time
&lt;/h2&gt;

&lt;p&gt;Meskipun angkanya merupakan total akumulasi, sistem memiliki mekanisme sinkronisasi otomatis:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broadcasting&lt;/strong&gt;&lt;br&gt;
Perubahan data (saat voucher baru terjual atau dibuat) dikirim secara instan ke browser menggunakan Laravel Echo (WebSockets) melalui event &lt;code&gt;DashboardStatsUpdated&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sync Service&lt;/strong&gt;&lt;br&gt;
Ada layanan &lt;code&gt;MikrotikSyncService&lt;/code&gt; yang secara berkala menghitung ulang statistik ini dan menyiarkannya ke dashboard agar angka selalu akurat tanpa perlu refresh halaman.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ringkasan Alur
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Voucher Dibuat → Masuk ke billing_history
Dashboard Update → Menampilkan total nilai rupiah dari seluruh voucher berdasarkan harga profil
WebSocket → Memastikan angka update otomatis di layar tanpa refresh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>analytics</category>
      <category>backend</category>
      <category>php</category>
      <category>sql</category>
    </item>
    <item>
      <title>funtion formatRupiah()</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Sun, 15 Feb 2026 16:09:11 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/funtion-formatrupiah-56hd</link>
      <guid>https://forem.com/mrkoala1001/funtion-formatrupiah-56hd</guid>
      <description>&lt;p&gt;Fungsi formatRupiah dalam aplikasi ini digunakan untuk mengubah angka mentah &lt;code&gt;(integer)&lt;/code&gt; menjadi format mata uang Rupiah yang standar. Fungsi ini terletak di dalam skrip JavaScript (Alpine.js) pada file &lt;code&gt;dashboard.blade.php&lt;/code&gt;&lt;br&gt;
.&lt;/p&gt;

&lt;p&gt;Berikut adalah rincian lengkapnya:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Source Code&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;formatRupiah(number) {
    return new Intl.NumberFormat('id-ID', { 
        style: 'currency', 
        currency: 'IDR', 
        minimumFractionDigits: 0 
    }).format(number).replace('Rp', 'Rp ');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Penjelasan Alur Kerja (Step-by-Step)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fungsi ini bekerja melalui 4 tahap otomatis:&lt;/p&gt;

&lt;p&gt;Tahap A: Menerima &lt;code&gt;Input (number)&lt;/code&gt; Fungsi menerima sebuah angka mentah, misalnya: 50000.&lt;/p&gt;

&lt;p&gt;Tahap B: Inisialisasi &lt;code&gt;Intl.NumberFormat&lt;/code&gt; Sistem menggunakan fitur bawaan browser modern bernama &lt;code&gt;Intl.NumberFormat&lt;/code&gt;. Di sini kita memberikan instruksi (konfigurasi):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id-ID&lt;/code&gt;: Gunakan standar lokal Indonesia (menggunakan titik sebagai pemisah ribuan).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;style: 'currency'&lt;/code&gt;: Format sebagai mata uang.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;currency: 'IDR'&lt;/code&gt;: Gunakan simbol mata uang Rupiah.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minimumFractionDigits: 0&lt;/code&gt;: Jangan tampilkan angka di belakang koma (sen), agar tampilan lebih bersih (misal: bukan Rp 50.000,00 tapi cukup Rp 50.000).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tahap C: Eksekusi Format &lt;code&gt;(.format(number))&lt;/code&gt; Pada tahap ini, angka 50000 diubah menjadi string: "Rp50.000". Perhatikan bahwa secara default, standar internasional tidak memberikan spasi antara "Rp" dan angkanya.&lt;/p&gt;

&lt;p&gt;Tahap D: Penyesuaian Spasi &lt;code&gt;(.replace('Rp', 'Rp '))&lt;/code&gt; Terakhir, fungsi melakukan manipulasi teks sederhana. Ia mencari teks "Rp" dan menggantinya dengan "Rp " (ditambah spasi).&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>laravel</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>DOKOMENTASI - HOT POT - DASHBOARD#1</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Sun, 15 Feb 2026 16:00:08 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/dokomentasi-hot-pot-dashboard1-1212</link>
      <guid>https://forem.com/mrkoala1001/dokomentasi-hot-pot-dashboard1-1212</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6l78hl3bb1grxqdwmk0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6l78hl3bb1grxqdwmk0e.png" alt=" " width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Card 1 pada Dashboard bertugas untuk menampilkan "Voucher Realtime". Berikut adalah penjelasan alur kodenya secara sistematis:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Struktur Visual (Baris 41-49)&lt;/strong&gt;&lt;br&gt;
Secara desain, Card ini adalah sebuah kotak (div) putih dengan bayangan halus yang berisi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Icon: Ikon tiket berwarna biru &lt;code&gt;(fas fa-ticket-alt)&lt;/code&gt; untuk merepresentasikan voucher.&lt;/li&gt;
&lt;li&gt;Label: Teks kecil di atas bertuliskan "VOUCHER REALTIME".&lt;/li&gt;
&lt;li&gt;Nilai (Angka): Di bawahnya terdapat angka nominal uang yang ditampilkan dengan ukuran besar dan tebal &lt;code&gt;(text-2xl font-black)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Sumber Data &amp;amp; Alpine.js (Baris 48)&lt;/strong&gt;&lt;br&gt;
Bagian yang paling penting adalah baris ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p class="text-2xl font-black text-slate-800" x-text="formatRupiah(stats.voucherRealtime)"&amp;gt;&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x-text&lt;/code&gt;: Ini adalah direktif dari &lt;code&gt;Alpine.js&lt;/code&gt;. Artinya, isi teks di dalam paragraf ini tidak diketik manual, melainkan mengambil nilai dari variabel JavaScript bernama &lt;code&gt;stats.voucherRealtime&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/mrkoala1001/funtion-formatrupiah-56hd"&gt;&lt;code&gt;formatRupiah()&lt;/code&gt;&lt;/a&gt;: Angka mentah dari database (misal: 2000) akan diproses oleh fungsi ini agar tampil cantik dengan format mata uang (misal: Rp 2.000).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.toBELUM"&gt;&lt;code&gt;stats.voucherRealtime&lt;/code&gt;&lt;/a&gt;: Data ini aslinya dikirim dari Controller melalui variabel &lt;a href="https://dev.toBELUM"&gt;&lt;code&gt;$statsData&lt;/code&gt;&lt;/a&gt; (Baris 10), lalu "ditanam" ke dalam &lt;code&gt;Alpine.js&lt;/code&gt; di baris 27.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Apa yang Dimaksud "Realtime"?&lt;/strong&gt;&lt;br&gt;
Nilai yang muncul di sini adalah Total Nominal Uang dari voucher yang sudah laku terjual.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data ini diambil dari tabel &lt;code&gt;billing_history&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Hanya menghitung voucher yang memiliki nilai pada kolom &lt;a href="https://dev.toBELUM[](url)"&gt;&lt;code&gt;first_login_at&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Disebut Realtime karena jika ada user yang baru saja login di MikroTik, angka di card ini akan otomatis terupdate tanpa Anda perlu merefresh halaman (berkat teknologi Websocket/Laravel Echo yang ada di baris 207-228).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>showdev</category>
      <category>ui</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Cara mengatasi color mode tidak aktif di Ubuntu Linux (firefox)</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Mon, 09 Feb 2026 07:37:54 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/cara-mengatasi-color-mode-tidak-aktif-di-ubuntu-linux-firefox-4dpl</link>
      <guid>https://forem.com/mrkoala1001/cara-mengatasi-color-mode-tidak-aktif-di-ubuntu-linux-firefox-4dpl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb580gezt089mm086399y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb580gezt089mm086399y.png" alt=" " width="800" height="574"&gt;&lt;/a&gt;&lt;br&gt;
Bagi pengguna Linux Ubuntu, mencetak dokumen langsung dari browser Firefox terkadang menemui kendala teknis, salah satunya adalah opsi Color Mode yang terkunci di mode Hitam Putih (Grayscale). Masalah ini sering muncul saat ingin mencetak dokumen berwarna seperti voucher Deep Net.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paksa lewat about:config (Solusi Internal Firefox)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firefox menyimpan preferensi printer di dalam konfigurasi "bawah tanah"-nya. Seringkali, pengaturan warna tersangkut di angka "0" (Mono).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buka tab baru, ketik about:config lalu tekan Enter&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Klik "Accept the Risk and Continue".&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9udu8trijmyl0weea8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9udu8trijmyl0weea8f.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cari kata kunci: print.printer_&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cari baris yang mengandung nama printer Anda dan berakhiran print_color_mode.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Contoh: print.printer_EPSON_L3110.print_color_mode&lt;/li&gt;
&lt;li&gt;Pastikan nilainya adalah true (untuk Color). Jika nilainya false ganti menjadi true.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Coba buka kembali jendela print&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gunakan "Print using the system dialog"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firefox versi terbaru sering menyembunyikan opsi warna di balik menu drop-down. Jika masih tidak bisa di klik:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tekan Ctrl + P untuk membuka menu print.&lt;/li&gt;
&lt;li&gt;Scroll paling bawah di panel sebelah kiri.&lt;/li&gt;
&lt;li&gt;Klik link bertuliskan "Print using the system dialog..."&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Di jendela baru yang muncul, klik tab option, centang color.&lt;/li&gt;
&lt;/ul&gt;

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

</description>
      <category>linux</category>
      <category>firefox</category>
      <category>printer</category>
    </item>
    <item>
      <title>Debug Freeradius</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Thu, 29 Jan 2026 15:15:25 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/debug-freeradius-2hi2</link>
      <guid>https://forem.com/mrkoala1001/debug-freeradius-2hi2</guid>
      <description>&lt;p&gt;ini adalah dia&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose stop lab-radius
docker run --rm -it -v $(pwd)/freeradius/raddb:/etc/raddb freeradius/freeradius-server:latest /bin/bash
freeradius -X
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>asd</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Tue, 27 Jan 2026 04:31:07 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/asd-59gn</link>
      <guid>https://forem.com/mrkoala1001/asd-59gn</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Cek User dan Password
docker exec -it lab-vpn cat /etc/ppp/chap-secrets

# Cek IPsec Pre-Shared Key (PSK)
docker exec -it lab-vpn cat /etc/ipsec.secrets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Dokumentasi Database MariaDB (Updated)</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Mon, 26 Jan 2026 17:06:33 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/dokumentasi-database-mariadb-updated-5c60</link>
      <guid>https://forem.com/mrkoala1001/dokumentasi-database-mariadb-updated-5c60</guid>
      <description>&lt;h4&gt;
  
  
  Cek &amp;amp; Masuk ke Database
&lt;/h4&gt;

&lt;p&gt;Gunakan perintah ini untuk masuk ke terminal MariaDB menggunakan user baru kamu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Login sebagai mrkoala
docker exec -it lab-mariadb mariadb -u mrkoala -p12345 -D nuxbilling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Jika ingin menggunakan akses penuh (superuser), tetap gunakan user root dengan password yang sesuai di file config kamu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Manajemen Database &amp;amp; Tabel
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Cek Database yang Ada: SHOW DATABASES; &lt;/li&gt;
&lt;li&gt;Hapus Database Lama: DROP DATABASE IF EXISTS nuxartbill; (Perintah ini akan menghapus database lama agar tidak membingungkan).&lt;/li&gt;
&lt;li&gt;Lihat Daftar Tabel di nuxbilling: USE nuxbilling; SHOW TABLES;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Ganti Value (Update Data)
&lt;/h4&gt;

&lt;p&gt;Jika kamu ingin mengubah data spesifik, misalnya mengganti nama paket atau profil user di dalam tabel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Contoh: Mengubah nama hotspot di tabel pengaturan
UPDATE settings SET value = 'Deep Net' WHERE setting = 'site_name';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Import SQL (Masukin Data)
&lt;/h4&gt;

&lt;p&gt;Jika kamu punya file .sql dari laptop yang sudah di-upload ke VPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -i lab-mariadb mariadb -u mrkoala -p12345 nuxbilling &amp;lt; nama_file_project.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Backup Database (Amankan Data)
&lt;/h4&gt;

&lt;p&gt;Sangat penting untuk melakukan backup rutin pada server perusahaan agar data billing tidak hilang:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec lab-mariadb mariadb-dump -u root -prootpass nuxbilling &amp;gt; backup_nuxbilling_$(date +%F).sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hal Penting Lainnya (Checklist)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sinkronisasi Aplikasi: Pastikan file konfigurasi PHPnuxBill di folder nuxartbil (biasanya file .env atau config.php) sudah diganti ke DB_USER=mrkoala dan DB_NAME=nuxbilling.&lt;/li&gt;
&lt;li&gt;Reset Jika Error: Jika user baru tidak terbaca, hapus folder ./db_data dan jalankan docker compose up -d lagi agar MariaDB melakukan inisialisasi ulang dengan user mrkoala.&lt;/li&gt;
&lt;li&gt;Nesting Proxmox: Pastikan fitur Nesting di tab Options CT kamu tetap aktif agar Docker bisa mengelola database dengan lancar.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>docker</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cara upload file nuxartbill dari local ke vps</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Mon, 26 Jan 2026 16:34:58 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/cara-upload-file-nuxartbill-dari-local-ke-vps-3mik</link>
      <guid>https://forem.com/mrkoala1001/cara-upload-file-nuxartbill-dari-local-ke-vps-3mik</guid>
      <description>&lt;p&gt;****Pertama kompres terlebih dahulu filenya&lt;br&gt;
Perhatikan, perintah ini dijalankan didalam folder project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zip -r project-billing.zip . -x "*.git*" "node_modules/*" "vendor/*"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Upload project ke vps kamu&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp project-billing.zip root@(ip vps):/root/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  File sudah terkirim ke vps
&lt;/h4&gt;

&lt;p&gt;jika file sudah terkirim ke vps kamu, selanjutnya adalah download paket unzip untuk ekstrak file tersebut&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install unzip jika belum ada
apt update &amp;amp;&amp;amp; apt install unzip -y

# Ekstrak file (ganti nama_file.zip sesuai nama filemu)
unzip nama_file.zip -d phpnuxbill
cd phpnuxbill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Install Docker
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Persiapan Repositori
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Hapus versi lama yang mungkin konflik
apt-get remove docker docker-engine docker.io containerd runc -y

# Install dependensi awal
apt-get update
apt-get install ca-certificates curl gnupg lsb-release -y

# Tambahkan GPG Key resmi Docker
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Tambahkan Sumber Aplikasi (Repository)
Perintah ini akan memberitahu Ubuntu 20.04 kamu untuk mengambil Docker dari sumber yang tepat:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Instalasi Docker &amp;amp; Compose V2
Sekarang, lakukan instalasi paket utamanya:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Verifikasi dan Jalankan Project
&lt;/h4&gt;

&lt;p&gt;etelah instalasi selesai, cek apakah perintah "spasi" sudah aktif: &lt;code&gt;docker compose version&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Jika muncul versi 2.x, sekarang kamu bisa langsung "up" kembali project Nuxbilling kamu: &lt;code&gt;cd ~/nuxbilling docker compose up -d&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ide project</title>
      <dc:creator>Mr koala</dc:creator>
      <pubDate>Sun, 25 Jan 2026 12:38:36 +0000</pubDate>
      <link>https://forem.com/mrkoala1001/ide-project-33p1</link>
      <guid>https://forem.com/mrkoala1001/ide-project-33p1</guid>
      <description>&lt;p&gt;aku tiba tiba kepikiran, ada ga sih cara biar bisa chat lewat cli di terminal linux&lt;br&gt;
jadi sekenarionya begini&lt;/p&gt;

&lt;p&gt;saya kan suka kerja desktop, jarang banget buka wa di mobile. akhirnya banyak hal hal penting terlewatkan, termasuk berbagi file. saya harus kirim file ke telegram dulu baru saya teruskan ke nomor wa teman saya.&lt;/p&gt;

&lt;p&gt;sebenarnya bisa saja menggunakan wa web tapi proses sinkronasinya lamaaaaa, dan sering ngebug. biki jengkel&lt;/p&gt;

&lt;p&gt;jadi aku kepikiran, kira kira bisa ga ya aku bikin suatu tool yang dimana aku bisa chat dengan temanku lewat terminal linux. chat nya bukan untuk semua nomor, tapi seperti room chat 1 orang&lt;/p&gt;

</description>
      <category>cli</category>
      <category>discuss</category>
      <category>linux</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
