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

Disable SSH Ask Pass di openSUSE

Ketika selesai menginstall git di openSUSE, ketika akan melakukan push ataupun pull pada repository yang membutuhkan autentikasi, akan muncul pop up untuk mengisi kolom nama dan password, Hal tersebut bagi saya kurang nyaman, maka bisa dinonaktifkan dengan cara berikut : git config --global core.askpass '' Sekian~.

30 Maret 2021 · 1 menit · Rifki Affandi

Membuat Docker Alert

Pendahuluan Container, ya sebuah istilah yang sedang populer pada era saat ini. dan saya pun memakainya baik untuk development aplikasi ataupun production. Namun beberapa hari belakangan ini tim saya mengalami kendala yakni sekitar 1-2 hari semua container yang berada di VM production berhenti secara tiba. Setelah diteliti hal ini disebabkan oleh docker daemon yang restart tanpa disuruh (asli bikin kesel). Dan kesalahan dari tim DevOps ialah tidak menambahkan parameter restart: always ketika production, jadilah ketika daemon docker restart dan container tidak me-restart otomatis. Yang lebih gak enak lagi ialah para client yang lebih dulu tau ketimbang tim DevOps. Karena itu pada tulisan kali ini saya akan membagi sedikit tips yang dibantu oleh Kang Mustapha untuk monitoring container docker dan mengirimkan alert ke Telegram apabila ada container yang mati (exited). ...

20 Oktober 2020 · 2 menit · Rifki Affandi

Install POWERDNS di Ubuntu 18.04

POWERDNS adalah DNS Server berbasis MySQL, yang ditulis dalam C ++ dan berlisensi Under GPL. PowerDNS dapat dikelola melalui web base interface (PowerAdmin). Pada tutorial kali ini akan membahas bagaimana menginstall dan mengkonfigurasi POWERDNS pada Ubuntu 18.04. Persiapan Ubuntu 18.04 Domain Tahap Instalasi Update repositori pada Ubuntu 18.04 sudo apt update Install MariaDB sudo apt install mariadb-server mariadb-client -y mysql_secure_installation Edit konfigurasi pada MariaDB vim /etc/mysql/mariadb.conf/50-server.cnf ........ bind = 0.0.0.0 ----> ganti dengan ip lokal ........ Restart MariaDB sudo systemctl restart mariadb Buat database pada database sudo mysql -u root -p CREATE DATABASE powerdns CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'YOURPASSWORD'; GRANT ALL ON powerdns.* TO 'powerdns'@'%' IDENTIFIED BY 'YOURPASSWORD'; FLUSH PRIVILEGES; USE powerdns; CREATE TABLE domains ( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT DEFAULT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE UNIQUE INDEX name_index ON domains(name); CREATE TABLE records ( id BIGINT AUTO_INCREMENT, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(10) DEFAULT NULL, content VARCHAR(64000) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, change_date INT DEFAULT NULL, disabled TINYINT(1) DEFAULT 0, ordername VARCHAR(255) BINARY DEFAULT NULL, auth TINYINT(1) DEFAULT 1, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX nametype_index ON records(name,type); CREATE INDEX domain_id ON records(domain_id); CREATE INDEX ordername ON records (ordername); CREATE TABLE supermasters ( ip VARCHAR(64) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL, PRIMARY KEY (ip, nameserver) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE TABLE comments ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(10) NOT NULL, modified_at INT NOT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, comment TEXT CHARACTER SET 'utf8' NOT NULL, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX comments_name_type_idx ON comments (name, type); CREATE INDEX comments_order_idx ON comments (domain_id, modified_at); CREATE TABLE domainmetadata ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, kind VARCHAR(32), content TEXT, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind); CREATE TABLE cryptokeys ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, flags INT NOT NULL, active BOOL, content TEXT, PRIMARY KEY(id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE INDEX domainidindex ON cryptokeys(domain_id); CREATE TABLE tsigkeys ( id INT AUTO_INCREMENT, name VARCHAR(255), algorithm VARCHAR(50), secret VARCHAR(255), PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm); Disable systemd-resolved sudo su systemctl disable systemd-resolved systemctl stop systemd-resolved ls -lh /etc/resolv.conf rm /etc/resolv.conf echo "nameserver 8.8.8.8" > /etc/resolv.conf Install POWERDNS (versi 4.1.13) sudo su edit repositori vi /etc/apt/sources.list.d/pdns.list ............. deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-auth-41 main ............. vi /etc/apt/preferences.d/pdns ... Package: pdns-* Pin: origin repo.powerdns.com Pin-Priority: 600 ... Install powerdns beserta dependensi yang dibutuhkan curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update sudo apt-get install pdns-server pdns-backend-mysql virtualenv python3-pip yarn -y apt-get install -y libmysqlclient-dev python3-mysqldb python-mysqldb libsasl2-dev libffi-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev pkg-config Setelah berhasil terinstall konfigurasi powerdns agar terhubung dengan backend mysql sudo vi /etc/powerdns/pdns.d/pdns.local.gmysql.conf ## Masukkan skrip berikut tanpa tanda # ...... launch=gmysql gmysql-host=#IPHOSTMYSQL gmysql-user=#USER gmysql-dbname=#YOURDB gmysql-password=#YOURPASSWORD gmysql-dnssec=yes Konfigurasi pdns.conf agar bisa dimonitoring echo 'api=yes' >> /etc/powerdns/pdns.conf echo 'api-key=YOURIPKEY' >> /etc/powerdns/pdns.conf echo 'webserver=yes' >> /etc/powerdns/pdns.conf echo 'webserver-address=0.0.0.0' >> /etc/powerdns/pdns.conf echo 'webserver-allow-from=0.0.0.0/0,::/0' >> /etc/powerdns/pdns.conf echo 'webserver-port=8081' >> /etc/powerdns/pdns.conf echo 'version-string=anonymous' >> /etc/powerdns/pdns.conf echo 'webserver-password=YOURPASSWORD' >> /etc/powerdns/pdns.conf Tes koneksi ke database /usr/sbin/pdns_server --daemon=no --guardian=no --loglevel=9 Jika berhasil restart pdns service sudo systemctl restart pdns Untuk tampilan GUI (POWERDNS Admin) di postingan selanjutnya ya! Salam Kebebasan!! Bye~ ...

14 September 2020 · 3 menit · Rifki Affandi

Setting Konfigurasi HAProxy Di OPNsense

OPNsense adalah proyek firewall berbasis open source berbasis FreeBSD OPNsense. Berikut adalah tutorial untuk mengkonfigurasi HAProxy di OPNsense. 1. Konfigurasi Firewall untuk HAProxy Buat 2 IP Forward pada konfigurasi firewall Firewall > NAT > Port Forward > + New Rule Interface : LAN TCP/IP Ver : IPv4 Protocol : TCP Source : any Destination port range : From - HTTP , to - HTTP Redirect target IP : #IPADDRESSOPNSENSE Redirect target port : HTTP SAVE Interface : LAN TCP/IP Ver : IPv4 Protocol : TCP Source : any Destination port range : From - HTTPS , to - HTTPS Redirect target IP : #IPADDRESSOPNSENSE Redirect target port : HTTP SAVE Buat Rule Floating Firewall > Rules Floating > + New Rule Action : Pass Interface : LAN Direction : in TCP/IP ver : IPv4 Protocol : TCP Source : any Destination : Lan Address Destination port range : From - HTTP , to - HTTP Action : Pass Interface : LAN Direction : in TCP/IP ver : IPv4 Protocol : TCP Source : any Destination : Lan Address Destination port range : From - HTTPS , to - HTTPS 2. Konfigurasi HAProxy Service > HAProxy > Setting Tambahkan Server Real Servers > Real Servers > + add Name : test-http FQDN or IP : #IPPUBLICSERVER Port : 80 SAVE Tambahkan Backend Pool Virtual Services > Backend Pool > + add Name : test_http Mode : Layer 7 Servers : test-http SAVE Tambahkan Conditions Rules and Check > Conditions > + add Name: test-http Condition type : Host Matches Host String : test-http Tambahkan Rules untuk frontend 443 Rules and Check > Rules > + add Name : pass_https_test_http Select Condition : test-http Execute function : Use specified Backend Pool Use backend pool : test_http Tambahkan Rules untuk frontend 80 (untuk redirect traffic ke https) Rules and Check > Rules > + add Name : redirect_to_https_http_test_nicolas_my_id Select Condition : test-http_nicolas_my_id Execute function : http-request redirect HTTP Redirect : scheme https Tambahkan frontend untuk port 80 Virtual Services > Public Services > + add Name : FrontEndHTTP Listent address : 0.0.0.0:80 Select Rules : redirect_to_https_http Tambahkan frontend untuk port 443 Virtual Services > Public Services > + add Name : FrontEndHTTPS Listent address : 0.0.0.0:443 Enable SSL offloading : (✓) Certificates : test-http # Pastikan sertifikat sudah di-import ke OPNsense Select Rules : pass_https_test_http

24 Agustus 2020 · 2 menit · Rifki Affandi