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/sanesekitar 33G/apps/app-datas/registrysekitar 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.
