Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
506 artikel
- 18.14devops
Ketika Custom Docker Image Membuat Playbook Upgrade Tidak Berlaku
Fleet-wide custom Docker image membuat playbook upgrade berbasis digest tidak berlaku; verifikasi bergeser ke endpoint aplikasi, upgrade path jadi clone→build→transfer.
TL;DR: Gara-gara build image 9router-custom sendiri, playbook lama yang bandingin digest Docker Hub jadi nggak berguna karena digestnya nggak akan pernah ada. Sekarang verifikasi lewat endpoint /api/version, upgrade-nya manual: build lokal, kirim via scp, terus docker load di server tujuan. Downtime cuma 15 detik per host, data aman.
#docker#ansible#automation - 17.46devops
Build Docker Image di Luar VPS Saat Registry Resmi Tertinggal
Image Docker Hub tertinggal dari rilis npm. Bangun image di mesin besar, kirim via save, gzip, dan scp, lalu load di VPS kecil tanpa build.
TL;DR: Rilis npm 9router 0.5.81 udah keluar tapi image Docker Hub-nya masih mentok di 0.5.75. Karena RAM server cuma 964MB dan gak mungkin build Next.js di situ, imagenya dibangun di mesin lokal terus dikirim pakai docker save, gzip, dan scp. Container lama cukup di-rename, jadi rollback gampang kalau yang baru bermasalah.
#docker#deployment#ssh - 21.18devops
Dry Run Ansible Crash di Task Report, Bukan di Task Utamanya
Task command di-skip saat --check, registered var jadi undefined, dan filter default di ujung chain nggak sempat nolong. Tempel default-nya dekat sumbernya.
TL;DR: Dry run Ansible --check gagal gara-gara task debug di akhir, padahal biang keroknya variabel register yang nggak keisi karena task sebelumnya ke-skip. default('?') nggak nolong karena dievaluasi terakhir, setelah filter last crash duluan. Fix-nya satu baris: tempel default(['(no output)']) sebelum last, langsung ijo lagi.
#ansible#automation#devops - 20.43devops
Upgrade Paket npm di dalam Container Docker yang Masih Jalan
Image Docker masih versi lama sementara npm sudah tiga rilis di depan. Solusinya: upgrade in-container via Ansible dengan health gate.
TL;DR: Gara-gara image decolua/9router:latest nggak di-update padahal npm udah rilis 0.5.81, solusinya tinggal npm i -g langsung di dalem container yang jalan terus restart. Catatan: CMD tetap eksekusi kode bundled di /app, jadi versi bisa masih lama. Restart aman karena writable layer kebawa, tapi re-create bikin perubahan hilang.
#docker#ansible#npm - 17.28devops
Rollout Node Exporter KTM Fleet dan Jebakan MaxAuthTries
Prometheus TargetDown di server ke-10 fleet: node_exporter nggak ada, Ansible gagal deploy karena SSH MaxAuthTries terbakar oleh urutan kunci ed25519. Fix = hardening SSH dulu (key-only, urutan kunci), baru monitoring — semua idempoten.
TL;DR: Monitor nyala merah alert TargetDown server kesepuluh, kira cuma kurang scrape config tapi SSH gagal total karena node_exporter nggak ada dan Ansible kena batas MaxAuthTries dari terlalu banyak kunci ed25519. Akhirnya benerin urutan playbook: hardening SSH dulu (hanya kunci, urutin biar nggak kebakar limit), baru deploy node_exporter. Sekarang idempoten, server baru jalanin playbook sama aja.
#ansible#prometheus#node-exporter - 17.23devops
Mendaftarkan KTM: Ketika Server Ke-10 Justru Membongkar Ilusi Otomatisasi
Server ke-10 fleet bongkar ilusi otomatisasi: SSH MaxAuthTries terbakar, cloud-init timpa hardening, node_exporter nggak ter-deploy. Pelajaran: fleet discipline berarti pipeline idempoten, bukan manual one-off.
TL;DR: Tambah server ke-10 gagal karena SSH MaxAuthTries 6 habis dipakai kunci salah urutannya, plus cloud-init override PasswordAuthentication lewat file drop-in yang menang leksikal. Server baru juga nggak pasang node_exporter jadi monitoring buta. Pelajarannya: playbook harus idempoten kelola config cloud-init eksplisit, jangan asumsikan rollout lama pasti jalan.
#ansible#ssh#hardening - 14.13tooling
Guard Konteks Prompt: Menutup Lubang Senyap di Sisi Input
Perakitan konteks yang gagal diam-diam bisa kirim pertanyaan telanjang ke chat AI. Guard dua ambang di sisi input menjaga rantai riset tetap jujur.
TL;DR: Pipeline riset AI bocor diam-diam karena prompt tanpa konteks lolos begitu aja, padahal sisi output udah dijaga ketat. Fix-nya sederhana: fungsi context_present() ngecek prompt minimal 400 karakter atau ada URL, kalo nggak ada cuma nulis warning plus tag context missing di JSON. Sengaja fail-soft, nggak blok, soalnya guard yang kejam malah bikin orang ngabaikin alarm.
#python#automation#llm - 13.11tooling
Scraper Chat AI: Saat Kata 'Sumber' Menipu Gate Selesai
Gate selesai scraper chat AI lolos di jawaban setengah jadi karena satu kata. Empat perbaikan dari satu audit loop polling, dari regex heading sampai clipboard.
TL;DR: Scraper riset sempat ngira jawaban tuntas padahal cuma setengah ditulis, gara-gara gate kegagalan lolos dari kata "Sumber" di tengah prosa. Empat perbaikan lahir dari satu audit: pola kegagalan cuma dicek sebelum jawaban ada, gate tuntas wajib heading "## Sumber" dijangkar, plus diagnostik clipboard. Intinya, kontrak eksplisit lebih tahan banting daripada heuristik longgar.
#python#regex#debugging - 11.15devops
Restart Bukan Deploy: Gerbang Pra-Restart Kontainer API
Gerbang restart: skrip kecil menolak restart kontainer API saat working tree masih kotor.
TL;DR: Penulis kaget skor dashboard jadi minus cuma gara-gara restart kontainer. Ternyata compose pakai bind mount, jadi restart malah menjalankan kode setengah jadi yang ada di disk, bukan dari image. Solusinya, skrip restart sekarang ngecek dulu kalau ansible/web bersih via git status, nolak jalan kalau masih kotor.
#docker#compose#bash