KDE Plasma ala macOS di openSUSE Tumbleweed (Sekaligus Pensiunkan GNOME)

Laptop saya awalnya pakai GNOME, lalu saya pasang KDE Plasma di atasnya. Setelah betah di Plasma, saya mau dua hal: tampilannya dibuat mirip macOS, dan GNOME dibersihkan supaya nggak ada dua desktop yang makan tempat dan bikin bingung saat update. Supaya bisa diulang di mesin lain, semuanya saya bungkus jadi satu skrip: kde-macos.sh. Skrip ini sudah lolos bash -n dan shellcheck. Isi skrip Skrip dijalankan sebagai user biasa (bukan root) dari dalam sesi Plasma. Bagian yang butuh root memakai sudo. ...

8 Oktober 2026 · 5 menit · Rifki Affandi

Mengatur CORS di Bucket Google Cloud Storage

Kasusnya sederhana: frontend (di localhost saat development dan di domain production) perlu membaca file langsung dari bucket Google Cloud Storage. Tanpa aturan CORS, browser akan menolak response-nya dengan error klasik No 'Access-Control-Allow-Origin' header. Aturan CORS yang mau dipasang kira-kira begini: [ { "origin": ["http://localhost:8090/", "https://example.com"], "method": ["GET"], "responseHeader": ["Content-Type"], "maxAgeSeconds": 3600 } ] Sekilas benar, tapi ada satu jebakan di situ. Jebakan: trailing slash di origin Perhatikan http://localhost:8090/. Header Origin yang dikirim browser tidak pernah diakhiri slash. Isinya selalu http://localhost:8090. GCS mencocokkan origin secara persis, jadi entri dengan slash di belakang tidak akan pernah cocok, dan request dari localhost tetap kena CORS error walaupun aturannya “sudah dipasang”. ...

8 Oktober 2026 · 3 menit · Rifki Affandi

Satu Pintu Alert ke Discord Pakai n8n: Sentry, Grafana, New Relic, dan Vercel

Di tim, alert kami tersebar di mana-mana: error aplikasi di Sentry, APM di Elastic, sebagian service di New Relic, dan deploy frontend di Vercel. Masing-masing punya integrasi Discord sendiri, tapi ada yang berbayar, ada yang terkunci lisensi, dan tampilannya beda-beda semua. Akhirnya saya pakai satu pola untuk semuanya: Sumber alert → Webhook n8n → Code (format embed) → HTTP Request → Discord ...

27 September 2026 · 20 menit · Rifki Affandi

Template Vault untuk File .env: Kapan Pakai Tanda Kutip, Kapan Tidak

Di salah satu service, konfigurasi aplikasi diambil dari Vault lalu ditulis jadi file .env memakai template (consul-template / Vault Agent). Template awalnya kira-kira seperti ini: {{ with secret "secret/data/dev/app/my-service" }} {{ range $k, $v := .Data.data }} {{- if (contains "\n" $v) -}} {{ $k }}="{{ $v | replaceAll "\n" "\\n" }}" {{- else -}} {{ $k }}="{{ $v }}" {{- end }} {{ end }} {{ end }} Hasilnya, setiap value dibungkus tanda kutip: ...

12 September 2026 · 3 menit · Rifki Affandi

Memperbesar Disk EC2 (EBS) Tanpa Downtime

Disk root salah satu server MongoDB production saya sudah terpakai 85% (68 dari 80 GB). Sebelum mentok, saya perbesar jadi 120 GB. Kabar baiknya, di EC2 ini bisa dilakukan online: tanpa reboot, tanpa stop MongoDB. Satu hal yang sering bikin bingung: setelah ukuran volume diubah di console, df tetap menunjukkan ukuran lama. Itu karena ada tiga lapisan yang harus diperbesar, dan AWS cuma mengurus lapisan pertama. ...

6 September 2026 · 4 menit · Rifki Affandi

openSUSE Tumbleweed di ThinkPad X1 Nano: Benerin Scaling GDM, Mikrofon, dan Speaker

Beberapa waktu lalu saya pasang openSUSE Tumbleweed dengan GNOME di ThinkPad X1 Nano Gen 1. Secara umum mulus, tapi ada tiga hal yang bikin saya cukup lama ngoprek: Layar login (GDM) tetap di-scale 150%, padahal sesi GNOME sudah 100%. Mikrofon hilang setelah pasang sof-firmware. X1 Nano punya 4 speaker, tapi yang “terdeteksi” cuma 2 dan suaranya pelan dibanding Windows. Tulisan ini merangkum apa yang ternyata jadi penyebab, termasuk jalan buntu yang sempat saya lewati. Siapa tahu kamu kena masalah yang sama. ...

26 Agustus 2026 · 7 menit · Rifki Affandi

Memasang Prometheus Exporter dengan Ansible

Monitoring yang enak dipakai itu dimulai dari metrik yang konsisten di semua server. Kalau node_exporter dipasang manual satu per satu di puluhan host, ujung-ujungnya versinya beda-beda, flag-nya beda, atau ada yang lupa di-enable sehingga mati setelah reboot. Di tulisan ini saya mau berbagi role Ansible sederhana untuk memasang exporter Prometheus supaya hasilnya selalu sama. Contohnya pakai node_exporter, tapi polanya bisa dipakai juga untuk exporter lain yang bentuknya satu binary, misalnya exporter MongoDB, MySQL, atau HAProxy. ...

9 Agustus 2026 · 4 menit · Rifki Affandi

Deploy MongoDB Replica Set dengan Ansible

Pasang satu server MongoDB secara manual itu gampang. Tapi kalau harus pasang tiga node replica set dengan konfigurasi yang sama persis, keyfile yang sama, autentikasi aktif, dan bisa dijalankan ulang kapan saja tanpa merusak cluster yang sudah jalan, ceritanya jadi lain. Di tulisan ini saya mau berbagi cara saya mengotomasinya pakai Ansible. Oh iya, semua nama host, user, dan nilai di bawah cuma contoh, jadi sesuaikan saja dengan lingkunganmu. Yang mau dicapai Tiga node MongoDB (satu primary, dua secondary) dalam replica set rs0. Autentikasi internal antar-node menggunakan keyfile. authorization aktif, dengan satu user admin. Playbook idempoten: mau dijalankan berapa kali pun hasilnya tetap sama, dan nggak mencoba rs.initiate() lagi di cluster yang sudah hidup. Rahasia seperti password dan keyfile disimpan di Ansible Vault, bukan ditaruh di repository sebagai teks biasa. Prasyarat Tiga server Ubuntu LTS yang bisa saling terhubung di port 27017 dan bisa dipanggil lewat nama host. Ansible di mesin kontrol, ditambah collection community.mongodb: ansible-galaxy collection install community.mongodb Modul-modul di collection ini butuh pymongo di node target. Sebelum pasang, cek dulu versi yang didukung di dokumentasi collection-nya. ...

26 Juli 2026 · 5 menit · Rifki Affandi

Membangun Automation Tools Internal untuk Pekerjaan Ops

Hampir semua orang ops punya satu folder berisi script kecil: cek disk, rotasi log, restart service, tarik laporan. Masalahnya baru kerasa waktu script itu mulai dipakai orang lain. Parameternya beda-beda, nggak ada mode uji coba, output-nya susah dibaca, dan satu salah ketik bisa langsung kena ke produksi. Di tulisan ini saya rangkum prinsip yang saya pakai untuk merapikan script-script seperti itu jadi satu automation tool internal yang bisa dipercaya tim. ...

5 Juli 2026 · 4 menit · Rifki Affandi

Membangun Layanan Paste Internal yang Aman

Hampir semua tim teknis pernah begini: butuh berbagi potongan log, konfigurasi, atau stack trace dengan cepat, lalu langsung tempel ke pastebin publik. Praktis sih, tapi berisiko. Log sering berisi token, alamat internal, atau data pengguna. Begitu masuk ke layanan publik, kita sudah nggak bisa mengontrol siapa yang membacanya atau berapa lama datanya disimpan. Jalan keluarnya adalah paste internal. Sama praktisnya, tapi jalan di infrastruktur sendiri dan cuma bisa diakses orang yang berhak. Di tulisan ini saya rangkum hal-hal yang perlu dipikirkan waktu mendesainnya, plus cara deploy yang menurut saya masuk akal. ...

14 Juni 2026 · 3 menit · Rifki Affandi