Kembali ke daftar artikel
17 Juni 20265 menit baca

Cerita Cleanup Docker Registry Saat Storage VPS Hampir Penuh

Dokumentasi teknis berbentuk storytelling tentang proses investigasi storage VPS yang hampir penuh, menemukan Docker Registry sebagai salah satu penyebab utama, lalu membersihkannya dengan Registry UI dan garbage collect.

Catatan editorial

Artikel ini ditulis berdasarkan kasus nyata saat storage VPS hampir penuh. Fokus utamanya adalah proses investigasi, cleanup log, analisis folder besar, dan pembersihan Docker Registry dengan cara yang aman.

Bahas kolaborasi
Cerita Cleanup Docker Registry Saat Storage VPS Hampir Penuh

Ketika Storage VPS Mulai Hampir Penuh

Masalah ini dimulai saat dashboard server menunjukkan storage VPS sudah berada di angka yang cukup mengkhawatirkan. Dari total sekitar 97 GiB, storage yang terpakai sudah mencapai sekitar 89 GiB.

Angka ini terlihat sederhana, tetapi untuk server produksi ini cukup berisiko. Jika storage terus naik, service bisa gagal menulis log, database bisa bermasalah, Docker bisa gagal pull image, dan proses deploy bisa berhenti tiba-tiba.

Langkah Pertama: Cek Pemakaian Disk dari Terminal

Langkah pertama yang dilakukan adalah melihat kondisi storage langsung dari terminal.

Command yang digunakan:

df -h

Hasilnya menunjukkan root partition sudah terpakai sekitar 93%.

Setelah itu, pengecekan dilanjutkan untuk mencari folder mana yang paling besar:

sudo du -xh --max-depth=1 / | sort -h

Dari sini terlihat bahwa folder /apps menggunakan sekitar 64G. Ini menjadi petunjuk penting, karena data aplikasi, volume, upload file, dan registry memang disimpan di dalam folder tersebut.

Menemukan Dua Penyebab Besar

Investigasi dilanjutkan ke dalam folder /apps.

Command yang digunakan:

sudo du -xh --max-depth=1 /apps/ | sort -h

Hasilnya menunjukkan beberapa folder besar, tetapi dua folder paling mencolok adalah:

  • /apps/app-datas/sane sekitar 33G
  • /apps/app-datas/registry sekitar 25G

Folder sane ternyata berisi file upload aplikasi. Sementara folder registry berisi data Docker Registry private yang digunakan untuk menyimpan image hasil build dan deploy.

Cleanup Log Dulu untuk Membuat Ruang Napas

Sebelum masuk ke registry, log server juga dicek.

Beberapa file log Nginx cukup besar, misalnya access log untuk web profile, Portainer, registry UI, API, dan service lainnya.

Command pengecekan log:

sudo find /apps/logs -type f -printf '%s %p\n' | sort -nr | head -30 | numfmt --to=iec --field=1

Karena file ini hanya log akses dan error, file tersebut aman untuk dikosongkan selama tidak sedang dibutuhkan untuk audit.

Command cleanup yang digunakan:

sudo find /apps/logs -type f \( -name "access.log" -o -name "error.log" \) -exec truncate -s 0 {} \;

Setelah itu, file log arsip juga bisa dihapus:

sudo find /apps/logs -type f \( -name "*.gz" -o -name "*.1" -o -name "*.log.*" \) -delete

Menambahkan Log Rotation agar Masalah Tidak Berulang

Cleanup log saja tidak cukup. Jika log terus tumbuh tanpa rotasi, masalah yang sama akan muncul lagi.

Maka dibuat konfigurasi logrotate:

sudo tee /etc/logrotate.d/apps-nginx-logs >/dev/null <<'EOF'
/apps/logs/*/*.log {
    su root root
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
    maxsize 100M
}
EOF

Awalnya sempat muncul error karena beberapa folder log dianggap memiliki permission yang tidak aman oleh logrotate. Solusinya adalah menambahkan:

su root root

Setelah itu, test logrotate berhasil dijalankan dengan mode debug:

sudo logrotate -d /etc/logrotate.d/apps-nginx-logs

Masuk ke Masalah Utama: Docker Registry

Setelah log dibersihkan, fokus utama kembali ke folder registry.

Docker Registry private digunakan untuk menyimpan image aplikasi seperti:

registry.sendistudio.id:5000/sane/prod/dashboard-web:latest
registry.sendistudio.id:5000/sane/prod/service-storage:latest
registry.sendistudio.id:5000/tongnyampah/bun-api:latest
registry.sendistudio.id:5000/projects/sewa-sofa-jakarta:latest

Container registry utama ditemukan dengan command:

docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}" | grep -Ei "registry|distribution"

Dari hasil pengecekan, container registry utama adalah:

app-registry

Sedangkan:

app-registry-ui

adalah UI untuk mengelola registry.

Kenapa Hapus dari Registry UI Belum Cukup

Image dan tag lama kemudian dihapus satu per satu dari Registry UI.

Namun, pada Docker Registry, menghapus tag dari UI belum tentu langsung menghapus file fisik di disk. Biasanya yang hilang baru referensi atau manifest-nya.

Layer image yang sudah tidak dipakai masih bisa tetap tersimpan sebagai blob. Inilah alasan kenapa ukuran folder registry belum tentu langsung turun setelah delete dari UI.

Untuk benar-benar membersihkan data lama, perlu menjalankan garbage collect.

[H2] Menjalankan Garbage Collect dengan Aman

Sebelum menjalankan garbage collect, sebaiknya tidak ada proses push image atau deploy ke registry.

Registry UI bisa dihentikan sementara:

docker stop app-registry-ui

Setelah itu, cek konfigurasi registry:

docker exec -it app-registry sh -lc 'cat /etc/docker/registry/config.yml'

Lalu jalankan dry-run terlebih dahulu:

docker exec -it app-registry registry garbage-collect --dry-run /etc/docker/registry/config.yml

Dry-run penting karena kita bisa melihat apa saja yang akan dibersihkan tanpa benar-benar menghapus data.

Jika hasil dry-run aman, lanjutkan garbage collect asli:

docker exec -it app-registry registry garbage-collect --delete-untagged /etc/docker/registry/config.yml

Setelah proses selesai, registry dan UI bisa dijalankan ulang:

docker restart app-registry
docker start app-registry-ui

Hasil Setelah Cleanup Registry

Setelah cleanup registry selesai, hasilnya terlihat sangat signifikan.

Sebelumnya storage server berada di sekitar:

89G dari 96G

Setelah cleanup, dashboard menunjukkan storage turun menjadi sekitar:

61 GiB dari 97 GiB

Artinya, sekitar 28GB berhasil dikembalikan.

Ini menunjukkan bahwa Docker Registry memang menyimpan banyak image layer lama yang sudah tidak dibutuhkan.

Pelajaran dari Kasus Ini

Ada beberapa pelajaran penting dari kasus ini.

Pertama, storage penuh tidak selalu disebabkan oleh database atau file upload. Pada server yang menggunakan Docker Registry private, image lama juga bisa menjadi penyebab besar.

Kedua, menghapus image dari Registry UI belum tentu cukup. Untuk benar-benar menghapus file fisik, Docker Registry perlu garbage collect.

Ketiga, cleanup log tetap penting, tetapi dampaknya biasanya tidak sebesar cleanup registry atau upload file.

Keempat, jangan langsung menghapus folder registry secara manual. Cara yang lebih aman adalah:

hapus tag/image lama dari Registry UI
jalankan garbage collect dry-run
jalankan garbage collect asli
restart registry
cek storage

Command Ringkas untuk Maintenance Berikutnya

Untuk maintenance berkala, alurnya bisa dibuat seperti ini:

# stop UI sementara
docker stop app-registry-ui

# jalankan garbage collect
docker exec -it app-registry registry garbage-collect --delete-untagged /etc/docker/registry/config.yml

# restart registry dan UI
docker restart app-registry
docker start app-registry-ui

# cek hasil
df -h
sudo du -sh /apps/app-datas/registry/data

Command ini sebaiknya dijalankan saat tidak ada proses deploy atau push image ke registry.

Kesimpulan

Cleanup Docker Registry bisa memberikan dampak besar pada VPS yang storage-nya hampir penuh.

Dalam kasus ini, proses investigasi dimulai dari df -h, dilanjutkan dengan pengecekan folder besar menggunakan du, cleanup log, lalu pembersihan Docker Registry dengan Registry UI dan garbage collect.

Hasil akhirnya cukup signifikan. Storage turun dari sekitar 89G menjadi 61G. Server menjadi lebih lega, dan keputusan untuk extend storage atau migrasi VPS bisa ditunda.

Untuk jangka panjang, registry tetap perlu dijaga dengan cleanup berkala. Sementara file upload aplikasi seperti folder sane/storage/uploads sebaiknya mulai dipertimbangkan untuk dipindahkan ke Object Storage.

Respons pembaca

Dibaca2
Suka1
Tidak suka0
Dibagikan0