devops
Catatan teknis seputar web development, DevOps, dan integrasi AI.
93 artikel
- 21.44ai
Plane MCP untuk self-host, tanpa OAuth, cukup header auth
Mode http plane-mcp-server selalu membangun OAuth dan crash tanpa env. Wrapper 16 baris membuka header auth, token tetap divalidasi ke Plane.
TL;DR: Container Plane MCP versi 033 langsung crash karena mode http maksa bikin OAuth app padahal env kosong. Ternyata kode header auth udah ada via get_header_mcp cuma nggak diekspos jadi gue bikin wrapper 16 baris biar validasi token langsung ke Plane. Enak mode stateless tanpa sesi jalan di loopback 8211 cuma butuh header Authorization tiap request.
#plane#mcp#ai - 21.40devops
502 dari Cloudflare Tunnel, ternyata cuma soal nama service
Tunnel bilang 502, semua kontainer hijau. Ternyata DNS jaringan compose cuma kenal nama service, dan alias enam baris langsung beres.
TL;DR: Docker nyala semua tapi URL publik malah 502 terus bikin bingung. Ternyata ingress tunnel nyari host proxy padahal nama service aslinya plane-proxy jadi nggak ketemu DNS. Akhirnya ditambahin alias proxy di compose biar nyambung lagi langsung 200.
#docker#compose#cloudflared - 20.58devops
Self-hosting Plane tanpa satu pun port publik
Cerita deploy Plane 13 service di VPS tunggal: cloudflared sidecar jadi satu-satunya pintu publik, state bind-mount, dan host tanpa port publik.
TL;DR: VPS gue udah sesak container, eh Plane malah maksa buka port 80 dan 443 lewat proxy defaultnya. Gue akalin dengan hapus semua ports, jalanin 13 service internal aja dan public-nya cuma lewat cloudflared tunnel ke proxy bukan port 8000. Enak banget firewall ketutup rapat cuma SSH, nggak usah ngurus certbot dan tetap jalan mulus di lokal.
#self-hosting#plane#docker - 06.14devops
Onboard Server KTM ke Ansible dan Swap Image 9router
Host KTM resmi dikelola Ansible: playbook upgrade 9router berlaku lagi setelah Docker Hub mengejar versi, dan swap ke image vendor 0.5.86 berjalan mulus.
TL;DR: Gue sempat mikir playbook error pas upgrade KTM ke 0586, ternyata registry Docker Hub aja yang ketinggalan di 0575. Makanya sempat build manual 0581, tapi akhirnya image vendor terbaru udah nongol dan playbook jalan mulus. Image custom lama masih nyangkut di disk dan tinggal dihapus manual nanti.
#docker#ansible#automation - 23.32devops
Kenapa Selftest R97 Gagal Saat Audit Berjalan
Audit meng-hash ulang setelah render jalan, selftest pun gagal. Artefak turunan harus keluar dari digest kanonik dan urutan verifikasi menentukan arti hash.
TL;DR: Selftest R97 gagal gara-gara audit menghitung digest kanonik setelah render, padahal render ngubah isi direktori yang lagi di-hash, jadi hashnya salah bukan karena kontennya. Solusinya, artefak turunan kayak nav.json dan pages.json dikeluarin dari digest; yang dijaga cuma sumber kebenarannya. Fixture selftest yang flake juga diganti mutasi berbasis path, checksum di-freeze ulang biar jejaknya jelas.
#python#testing#ci - 23.29devops
Validator Raib, CI Tetap Hijau
Sync mirror menghapus skrip validasi dan CI tetap hijau. Tiga kelas kegagalan validator plus dua pagar murah berupa anchor wajib dan checksum beku.
TL;DR: Validator bisa hilang diam-diam tapi pipeline tetap hijau, padahal hijau harusnya berarti sehat. Ada tiga kelas kegagalannya: validator hilang, rusak senyap, atau rapuh gara-gara perilaku shell yang beda-beda. Solusinya murah: wajibkan anchor di terjemahan dan freeze checksum selftest, jadi kalau validator nggak cocok pipeline langsung merah.
#git#bash#python - 21.30devops
Argumen Tertukar, Budget Terbakar: Validasi Harus di Paling Atas
Set -euo pipefail tidak menyelamatkan skrip dari argumen tertukar. Guard whitelist dan exit code khusus di pintu masuk mencegah budget terbakar.
TL;DR: Job pertama lancar tapi argumen skrip ternyata tertukar, dana $0.137 kebuang percuma padahal set -euo pipefail udah aktif. Ternyata -u cuma nangkep variabel yang belum didefinisiin, bukan yang isinya salah. Solusinya: guard validasi di paling atas skrip pakai case, lengkap sama exit code khusus biar gagalnya cepat.
#bash#shellcheck#linux - 20.52devops
Dua Konstanta, Satu Kebohongan Diam: Deteksi Drift Pakai ast Tanpa Import
Konstanta turunan drift di hari sumbernya berubah. ast.parse membandingkannya tanpa mengeksekusi satu baris pun.
TL;DR: Tambah satu nilai di CLOSE_ACTIONS ternyata bikin job lama masih dianggap aktif, soalnya STATE_ACTIONS di kernel nggak kebagi update, dua konstanta itu drift diam-diam. Solusinya skrip check-close-actions-drift.sh yang baca dua file sebagai teks pakai ast Python, tanpa import. Skrip ngitung proyeksi STATE_ACTIONS minus EXTRACT_TIME dan NONSTATE, lalu bandingin sebagai set; beda dikit aja langsung exit 1.
#python#testing#debugging - 20.39devops
Launcher Dua Kali Bayar: Tiga Lapis Penjaga Sebelum Skrip Delegasi Menyala
Skrip delegasi yang diluncurkan dua kali menghabiskan budget dua kali. Guard flock, cek artefak, dan pgrep menolak sebelum mulai.
TL;DR: Ceritanya session Claude Code kelihatan macet padahal lagi mikir, jadi gue jalankan ulang dan dua proses makan budget bareng. Solusinya flock -n via file descriptor, plus cek result JSON lama dan pgrep -f buat deteksi proses kembar. Alasan penolakan dibedain lewat exit code 42, 43, 44 biar gampang debug.
#bash#devops#automation