Skip to main content

Disk Space Management

This guide explains how to analyze, clean, and optimize disk space on your VPS.

Analyze Disk Usage

Overview

df -h

Example:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1 50G 35G 15G 70% /
tmpfs 1.9G 0 1.9G 0% /dev/shm

Detail by Folder

# Size of main folders
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -15

Typical result:

15G     /var
8G /usr
5G /home
3G /opt

Analyze a Specific Folder

# Analyze /var
du -h --max-depth=1 /var | sort -hr

# Analyze /home
du -h --max-depth=1 /home | sort -hr

Interactive Tool: ncdu

# Install
sudo apt install ncdu

# Analyze
sudo ncdu /

# Navigation: arrows, Enter to go in, d to delete

Clean the System

APT Packages

# Remove orphan packages
sudo apt autoremove -y

# Empty APT cache
sudo apt clean

# Remove old kernels
sudo apt autoremove --purge -y

Space recovered: ~500MB to 2GB

Cache and Temporary Files

# Temporary files
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

# Thumbnail cache (if desktop)
rm -rf ~/.cache/thumbnails/*

System Logs

# Current log size
du -h /var/log/

# Clean systemd journals (keep 7 days)
sudo journalctl --vacuum-time=7d

# Or keep max 500MB
sudo journalctl --vacuum-size=500M

# Delete old compressed logs
sudo find /var/log -name "*.gz" -delete
sudo find /var/log -name "*.1" -delete
sudo find /var/log -name "*.old" -delete

Log Rotation

Configure automatic rotation:

sudo nano /etc/logrotate.d/custom
/var/log/*.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
}

Clean Docker

If you use Docker:

# View usage
docker system df

# Remove unused resources
docker system prune -af

# Also remove unused volumes
docker system prune -af --volumes

# Remove untagged images
docker image prune -af
Warning

docker system prune --volumes deletes unattached volumes. Verify you don't have important data.

Clean Applications

Node.js / npm

# npm cache
npm cache clean --force

# Unused node_modules
find /home -name "node_modules" -type d -exec du -sh {} \; 2>/dev/null
# Delete those no longer needed
rm -rf /path/to/project/node_modules

Python / pip

# pip cache
pip cache purge

# Or manually
rm -rf ~/.cache/pip

Composer (PHP)

# Composer cache
composer clear-cache
rm -rf ~/.composer/cache

Find Large Files

# Files > 100MB
find / -type f -size +100M 2>/dev/null | xargs ls -lh

# Files > 500MB
find / -type f -size +500M 2>/dev/null | xargs ls -lh

# Top 20 largest files
find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -20

Priority Files to Check

Application Logs

# Nginx logs
du -h /var/log/nginx/

# Apache logs
du -h /var/log/apache2/

# MySQL logs
du -h /var/log/mysql/

Forgotten Backups

# Search for .bak, .backup, .old
find / -name "*.bak" -o -name "*.backup" -o -name "*.old" 2>/dev/null | xargs du -ch

Core Dumps

# Search for core dumps
find / -name "core.*" -o -name "core" 2>/dev/null

PHP Session Files

du -h /var/lib/php/sessions/
# Clean old sessions
find /var/lib/php/sessions/ -type f -mtime +7 -delete

Increase Disk Space

Add Swap (temporary)

# Create a 2GB swap file
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Make permanent
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Mount External Storage

If your plan includes additional storage:

# List disks
lsblk

# Format (if new)
sudo mkfs.ext4 /dev/sdb

# Create mount point
sudo mkdir /mnt/storage

# Mount
sudo mount /dev/sdb /mnt/storage

# Auto-mount at boot
echo '/dev/sdb /mnt/storage ext4 defaults 0 2' | sudo tee -a /etc/fstab

Automatic Cleanup Script

sudo nano /usr/local/bin/clean-disk.sh
#!/bin/bash

echo "=== Disk cleanup $(date) ==="

# Space before
echo "Space before:"
df -h /

# APT
echo "Cleaning APT..."
apt autoremove -y > /dev/null
apt clean > /dev/null

# Systemd journals
echo "Cleaning journals..."
journalctl --vacuum-time=7d > /dev/null

# Old logs
echo "Cleaning old logs..."
find /var/log -name "*.gz" -delete
find /var/log -name "*.1" -delete

# Temporary files
echo "Cleaning temporary files..."
rm -rf /tmp/* 2>/dev/null
rm -rf /var/tmp/* 2>/dev/null

# Docker (if installed)
if command -v docker &> /dev/null; then
echo "Cleaning Docker..."
docker system prune -af > /dev/null 2>&1
fi

# Space after
echo ""
echo "Space after:"
df -h /

echo ""
echo "=== Cleanup complete ==="
sudo chmod +x /usr/local/bin/clean-disk.sh

Add to cron (weekly):

sudo crontab -e
0 3 * * 0 /usr/local/bin/clean-disk.sh >> /var/log/clean-disk.log 2>&1

Disk Space Alerts

Alert script:

sudo nano /usr/local/bin/disk-alert.sh
#!/bin/bash

THRESHOLD=85
EMAIL="admin@yourdomain.com"

USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
echo "ALERT: Disk at ${USAGE}% on $(hostname)" | \
mail -s "Disk alert $(hostname)" $EMAIL
fi
sudo chmod +x /usr/local/bin/disk-alert.sh

Daily cron:

0 9 * * * /usr/local/bin/disk-alert.sh

Best Practices

  1. Regularly monitor disk space with df -h
  2. Configure alerts before reaching 90%
  3. Automate cleanup with crons
  4. Limit log size with logrotate
  5. Store backups elsewhere than on the main VPS
Tip

A disk should never exceed 85% usage to maintain a safety margin.