smol-image-processor – Mikroservis yang menormalkan ke WebP setelah menghapus EXIF/metadata (Bun/Elysia)
(github.com/levish0)Saat backend menerima unggahan gambar dari pengguna, ada beberapa masalah yang diam-diam ikut terbawa.
- JPEG dapat mengandung koordinat GPS, nama model perangkat, dan waktu pengambilan dalam EXIF
- Metadata warna seperti profil ICC juga bisa tersimpan dan terdistribusi apa adanya
- Jika JPEG, PNG, GIF, dan WebP masuk bercampur, pipeline penyimpanan/CDN/rendering menjadi rumit
- Jika EXIF orientation saja ditangani keliru, gambar bisa tersimpan dalam keadaan berputar 90°
smol-image-processor adalah mikroservis dengan satu peran yang menangani masalah-masalah ini secara sekaligus.
Cara kerja
Jika gambar diunggah ke POST /process sebagai multipart/form-data, responsnya akan selalu
berupa WebP. Ini memanfaatkan langsung perilaku output bawaan Sharp yang membuang metadata
seperti EXIF sumber dan profil ICC. Namun, untuk EXIF orientation, .rotate() terlebih dahulu
diterapkan ke piksel sebelum metadata dihapus agar arah gambar tetap terjaga.
Ada dua lapisan pertahanan.
- Batas jumlah piksel (MAX_PIXELS): meski ukuran file kecil, gambar yang saat didekode dapat
mengembang menjadi ratusan juta piksel (decompression bomb) diblokir denganlimitInputPixelsmilik Sharp. - Batas jumlah frame (MAX_PAGES): mencegah DoS yang menguras memori dan CPU melalui GIF/WebP animasi
dengan ratusan hingga ribuan frame.
GIF/WebP animasi dikonversi menjadi animated WebP, dan jeda frame serta jumlah loop tetap
dipertahankan. Kanal alfa pada PNG juga tetap dipertahankan.
Header respons memuat width, height, size, status animated, dan jumlah halaman dari gambar
yang diproses, sehingga bisa langsung disimpan ke DB tanpa tahap ekstraksi metadata terpisah.
Stack
- Runtime: Bun, framework HTTP: Elysia
- Pemrosesan gambar: Sharp (wrapper libvips)
- Menyediakan image Docker (GHCR)
Mulai cepat
docker run --rm -p 6701:6701 ghcr.io/levish0/smol-image-processor
curl -F file=@photo.jpg http://localhost:6701/process -o clean.webp
Belum ada komentar.