Membuat health check website sederhana dengan Bash dan curl
Bangun script health check yang mencatat HTTP status, waktu respons, URL akhir, dan curl exit code agar kegagalan DNS, koneksi, TLS, timeout, dan aplikasi tidak tercampur.
Dipublikasikan 25 September 2026
Tujuan latihan
Membuat dan menjalankan satu script Bash yang memeriksa URL secara repeatable, mengeluarkan status UP, DOWN, atau ERROR, serta menentukan tindakan berikutnya dari bukti yang dikumpulkan.
Persiapan
Mesin Linux atau macOS dengan Bash dan curl. Gunakan URL milik sendiri atau domain dokumentasi. Jangan menaruh token, cookie, kredensial, atau data customer di script maupun log.
URL target→
curl probe→
HTTP + timing + exit code→
UP / DOWN / ERROR
Masalah
Membuka website dari browser hanya menjawab apakah halaman terlihat pada saat itu. Automation membutuhkan hasil yang konsisten dan dapat dibaca program: apakah DNS/TCP/TLS berhasil, status HTTP apa yang diterima, berapa lama request berlangsung, dan URL akhir setelah redirect. Tanpa memisahkan bukti tersebut, HTTP 500 dapat keliru dianggap sama dengan DNS timeout.
Persiapan
Latihan ini menggunakan GET lalu membuang response body agar perilakunya lebih dekat dengan request browser dibanding HEAD, karena sebagian aplikasi memperlakukan HEAD secara berbeda. Contoh memakai example.com dan TLD .invalid yang dicadangkan untuk dokumentasi. Contoh output diberi label simulasi dan bukan hasil dari production atau lab pengguna.
1. Pastikan Bash dan curl tersedia
Tujuannya memastikan command yang dipakai benar-benar tersedia sebelum menulis script. Perhatikan versi Bash dan curl serta protocol HTTPS pada daftar Features/Protocols curl. Jika command not found, instal melalui package manager yang disetujui organisasi. Jika HTTPS tidak didukung oleh build curl, jangan lanjutkan ke target HTTPS sampai paket yang benar tersedia.
bash --version | head -n 1
curl --version
2. Tentukan arti UP, DOWN, dan ERROR
Gunakan kebijakan sederhana dan eksplisit: UP untuk HTTP 2xx atau 3xx, DOWN untuk respons HTTP 4xx/5xx, dan ERROR ketika curl gagal sebelum memperoleh respons yang dapat dievaluasi, misalnya DNS gagal, koneksi ditolak, TLS gagal, atau timeout. Kebijakan ini membuktikan availability dasar, bukan kesehatan seluruh fitur aplikasi. Endpoint login yang merespons 200 masih dapat memiliki masalah di backend.
3. Jalankan satu probe manual
Perintah berikut mengikuti maksimal lima redirect, membatasi connection setup lima detik dan total transfer lima belas detik, membuang body, lalu menampilkan HTTP code, total time, dan effective URL. --silent menghilangkan progress meter, sedangkan --show-error tetap menampilkan error curl. Amati apakah http berisi tiga digit, time masuk akal untuk baseline Anda, dan final menunjukkan tujuan redirect yang diharapkan.
Nilai berikut hanya contoh format. http=200 menunjukkan server memberi respons sukses, curl_exit=0 berarti transfer curl selesai tanpa error yang dilaporkan, dan final menunjukkan URL setelah redirect. Nilai time bukan batas universal; bandingkan dengan baseline dan lokasi probe yang sama.
4. Pahami dua jenis status sebelum membuat keputusan
HTTP status berasal dari server atau proxy, sedangkan curl exit code berasal dari proses curl. Tanpa --fail, curl umumnya tetap exit 0 saat menerima HTTP 404 atau 500 karena transfer berhasil secara teknis. Ini sengaja dipertahankan agar script dapat membedakan DOWN di layer HTTP dari ERROR sebelum HTTP. Exit code curl 6 mengarah ke name resolution, 7 ke koneksi, 28 ke timeout, dan 60 ke verifikasi sertifikat; baca pesan error lengkap sebelum menyimpulkan.
5. Buat script health check
Script berikut menerima URL sebagai argumen dan memakai example.com sebagai default. Hasil curl disimpan sebelum exit code diperiksa. Jangan menambahkan set -e tanpa memahami dampaknya, karena shell dapat berhenti saat curl gagal sebelum script sempat membentuk output ERROR. Regex 2xx/3xx adalah policy contoh yang dapat dipersempit menjadi hanya 2xx untuk endpoint health khusus.
Simpan sebagai check-url.sh. bash -n memeriksa syntax tanpa menjalankan request; tidak ada output biasanya berarti parser tidak menemukan syntax error. Setelah itu beri executable permission. Jika bash -n menampilkan nomor baris, perbaiki quoting atau pasangan if/fi sebelum menjalankan script.
bash -n check-url.sh
chmod 750 check-url.sh
ls -l check-url.sh
7. Jalankan kondisi normal dan baca hasil
Jalankan script dengan URL lab. Perhatikan timestamp UTC, status, HTTP code, time, dan final_url. Setelah command selesai, cek exit status shell secepatnya karena command berikutnya akan mengganti nilai $?. UP dengan exit 0 berarti policy dasar terpenuhi; URL akhir yang tidak dikenal tetap perlu diperiksa walaupun statusnya UP.
Output berikut hanya ilustrasi. Timestamp membuat setiap eksekusi dapat dibedakan, sedangkan script_exit=0 memudahkan scheduler atau monitoring membaca keberhasilan.
TLD .invalid dicadangkan untuk nama yang pasti tidak valid. Gunakan ini untuk memahami failure path DNS tanpa menyentuh domain production. Hasil yang diharapkan adalah pesan curl tentang resolve failure, status=ERROR, curl_exit=6, dan script exit 2. Jika justru ada HTTP response, periksa proxy, DNS interception, atau captive portal pada jaringan sebelum mempercayai hasil.
Pesan wording curl dapat berbeda antarversi. Bukti utama adalah curl_exit dan tidak adanya HTTP status yang valid, bukan menyalin satu kalimat error secara persis.
curl: (6) Could not resolve host: host-tidak-ada.invalid
2026-09-25T03:05:00Z status=ERROR curl_exit=6 url=https://host-tidak-ada.invalid/
script_exit=2
9. Uji jalur DOWN dengan endpoint lab
Gunakan path lab yang sengaja mengembalikan 404 atau 500. Karena transfer HTTP berhasil, curl exit dapat tetap 0, tetapi script mengubah hasil menjadi DOWN dan exit 1 berdasarkan HTTP code. Contoh URL di bawah hanya pola dokumentasi; siapkan endpoint milik sendiri dengan respons yang diketahui sebelum menilai hasil.
HTTP 404 berarti ada komponen HTTP yang menjawab, sehingga arah pemeriksaan berbeda dari DNS atau connection timeout. Periksa path, routing aplikasi, deployment, authentication, atau policy proxy sesuai endpoint.
Untuk latihan lokal, redirect stdout dan stderr ke satu file agar hasil sukses maupun error tersimpan. Gunakan path log dengan permission yang sesuai dan rotasi jika dijalankan berkala. Jangan memasukkan token ke URL karena query string dapat muncul pada final_url dan log. Jangan mencatat response body yang mungkin berisi data sensitif.
Gejala → bukti → interpretasi → tindakan berikutnya: status UP tetapi final_url salah berarti audit redirect; DOWN dengan 4xx berarti periksa path, authentication, WAF, atau authorization; DOWN dengan 5xx berarti periksa proxy/origin/aplikasi; ERROR 6 berarti cek DNS dan resolver; ERROR 7 berarti cek alamat, port, route, firewall, atau listener; ERROR 28 berarti cek titik timeout dan latency; ERROR 60 berarti cek hostname, masa berlaku, chain, waktu sistem, dan trust store. Jika satu bukti normal, lanjut ke tahap berikutnya—jangan mengubah beberapa layer sekaligus.
Kesalahan umum
Jangan memakai -k/--insecure untuk membuat certificate error terlihat sehat. Jangan menganggap curl exit 0 sama dengan HTTP 200. Jangan memakai HEAD tanpa memastikan aplikasi mendukungnya. Jangan menghapus timeout karena proses dapat menggantung. Jangan menaruh password/token langsung di script, argument, URL, atau log. Jangan menyebut website sehat hanya dari satu URL bila fungsi pentingnya membutuhkan database, authentication, atau dependency lain.
Checklist verifikasi
Pastikan Bash/curl tersedia, URL di-quote, redirect dibatasi, connect timeout dan total timeout disetel, body dibuang, HTTP code/time/effective URL dicatat, curl exit dibaca sebelum command lain, UP/DOWN/ERROR memiliki exit code berbeda, syntax lolos bash -n, failure path DNS serta HTTP diuji dengan target aman, dan log tidak menyimpan secret.
Pelajaran
Health check yang berguna tidak hanya mencetak “website hidup”. Dengan memisahkan HTTP status dari curl exit code, script sederhana sudah dapat menunjukkan apakah masalah berada sebelum HTTP atau pada respons aplikasi. Pola ini dapat dikembangkan ke scheduler dan alerting setelah output serta failure path benar-benar dipahami.