คู่มือทำความสะอาดดิสก์บน Ubuntu Server อย่างปลอดภัย ครอบคลุม APT cache, journald logs, Docker, ERPNext backups, MariaDB binlogs และ Enterprise Backup Rotation ด้วย S3

ดิสก์เต็มบน Server เป็นปัญหาที่เจอบ่อยมาก โดยเฉพาะ Server ที่รัน ERPNext, Docker หรือ Production workloads บทความนี้เป็น Checklist ที่ทำซ้ำได้สำหรับการทำความสะอาดดิสก์บน Ubuntu อย่างปลอดภัย ครอบคลุมตั้งแต่คำสั่งพื้นฐานไปจนถึง Enterprise Backup Rotation ด้วย S3
# ดูพื้นที่ดิสก์ทั้งหมด
df -h
# หาว่าอะไรกินพื้นที่
sudo du -xh / --max-depth=1 | sort -h
# Drill down ถ้าต้องการ
sudo du -xh /var --max-depth=1 | sort -hsudo apt clean
sudo apt autoclean
sudo apt autoremove --purgeลบไฟล์ .deb ที่ดาวน์โหลดไว้และ Dependencies ที่ไม่ใช้แล้ว ปลอดภัยมาก รันได้เสมอ
# ดู Kernels ที่ติดตั้ง
dpkg --list | grep linux-image
# ลบอัตโนมัติ
sudo apt autoremove --purge# ตรวจขนาด Log
journalctl --disk-usage
# เก็บเฉพาะ 7 วันล่าสุด
sudo journalctl --vacuum-time=7d
# หรือจำกัดขนาด 500MB
sudo journalctl --vacuum-size=500M# ดูไฟล์ Log ที่ใหญ่
sudo du -sh /var/log/*
# Truncate Logs ที่ใหญ่ (ปลอดภัย — ไฟล์ยังอยู่ แค่เนื้อหาว่าง)
sudo truncate -s 0 /var/log/*.log# ตรวจ Docker ใช้พื้นที่เท่าไร
docker system df
# ล้างทุกอย่างที่ไม่ใช้
docker system prune -a --volumesคำเตือน:
--volumesจะลบ Volumes ที่ไม่มี Container ใช้ด้วย ตรวจให้ดีก่อนรัน
# ล้าง Temp files
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*
# ล้าง User cache
rm -rf ~/.cache/*sudo apt clean
sudo apt autoremove --purge
sudo journalctl --vacuum-time=7d
rm -rf ~/.cache/*
df -h # ตรวจผลลัพธ์ตัวกินพื้นที่หลักบน ERPNext Server:
| ตัวการ | ตำแหน่ง | ขนาดโดยทั่วไป |
|---|---|---|
| Bench Backups | sites/*/private/backups | หลาย GB |
| Site Files | sites/*/private/files | ขึ้นกับการใช้งาน |
| Logs | logs/, /var/log | 100MB - 1GB+ |
| MariaDB Binlogs | /var/lib/mysql | หลาย GB |
| Docker | /var/lib/docker | หลาย GB (ถ้าใช้) |
ERPNext สร้าง Backup อัตโนมัติทุกวัน — เป็นตัวกินพื้นที่อันดับ 1:
# ตรวจขนาด
du -sh sites/*/private/backups
# ลบ Backups เก่ากว่า 7 วัน
find sites -type f -path "*/private/backups/*.sql.gz" -mtime +7 -delete
find sites -type f -path "*/private/backups/*.tgz" -mtime +7 -deleteคำสั่งนี้อย่างเดียวมักคืนพื้นที่ได้หลาย GB
find logs -type f -name "*.log" -exec truncate -s 0 {} \;find sites -type f -name "*.log" -mtime +7 -deleteBinary Logs ใช้สำหรับ Replication — ถ้าไม่ได้ใช้ Replication สามารถลบได้:
# ตรวจ Binary Logs
sudo mysql -e "SHOW BINARY LOGS;"
# ลบเก่ากว่า 7 วัน (เฉพาะเมื่อไม่ได้ใช้ Replication)
sudo mysql -e "PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 7 DAY);"rm -rf sites/assets/*
bench build --productionสร้างสคริปต์ที่ /usr/local/bin/erpnext-clean.sh:
ตั้งค่า:
sudo chmod +x /usr/local/bin/erpnext-clean.sh
# เพิ่ม Cron Job (รันทุกวัน ตี 3)
sudo crontab -e
# เพิ่มบรรทัด:
# 0 3 * * * /usr/local/bin/erpnext-clean.sh >> /var/log/erpnext-clean.log 2>&1สำหรับ Production ระดับ Enterprise ที่ต้องการ Backup ที่เชื่อถือได้:
aws configures3:PutObject, s3:GetObject, s3:ListBucket, s3:DeleteObject90% ของกรณีมาจาก Bench Backups ที่สะสม ลองรัน du -sh sites/*/private/backups ก่อนเสมอ
ได้ ถ้าไม่ได้ใช้ Replication ถ้าใช้ Replication อยู่ ห้ามลบ — จะทำให้ Slave ขาดข้อมูล
docker system prune -a ลบอะไรบ้าง?ลบ Images, Containers, Networks ที่ไม่ได้ใช้ทั้งหมด ถ้าเพิ่ม --volumes จะลบ Volumes ที่ไม่มี Container ใช้ด้วย
แนะนำ ทุกวัน สำหรับ Backup Cleanup และ ทุกสัปดาห์ สำหรับ APT + Journal — หรือรวมเป็น Daily Script เดียวก็ได้
sudo find / -type f -size +1G -exec ls -lh {} \;#!/bin/bash
BENCH_DIR="/home/frappe/frappe-bench"
echo "Starting ERPNext cleanup..."
cd $BENCH_DIR || exit
# ลบ Backups เก่ากว่า 7 วัน
find sites -type f -path "*/private/backups/*.sql.gz" -mtime +7 -delete
find sites -type f -path "*/private/backups/*.tgz" -mtime +7 -delete
# ล้าง Bench Logs
find logs -type f -name "*.log" -exec truncate -s 0 {} \;
# ล้าง Site Logs เก่า
find sites -type f -name "*.log" -mtime +7 -delete
# ล้าง APT cache
apt clean -y
apt autoremove --purge -y
# ล้าง System Journal
journalctl --vacuum-time=7d
echo "ERPNext cleanup completed."#!/bin/bash
set -e
BENCH_DIR="/home/frappe/frappe-bench"
BACKUP_ROOT="$BENCH_DIR/enterprise-backups"
DATE=$(date +%Y-%m-%d)
DAY_OF_MONTH=$(date +%d)
DAY_OF_WEEK=$(date +%u)
S3_BUCKET="s3://your-backup-bucket"
LOG_FILE="/var/log/erpnext-enterprise-backup.log"
echo "==== Backup started at $(date) ====" >> $LOG_FILE
mkdir -p $BACKUP_ROOT/{daily,weekly,monthly}
cd $BENCH_DIR
# Backup ทุก Site
bench --site all backup --with-files
# ย้าย Backup ล่าสุดเข้า daily
find sites -type f -path "*/private/backups/*.sql.gz" -mtime -1 \
-exec mv {} $BACKUP_ROOT/daily/ \;
find sites -type f -path "*/private/backups/*.tgz" -mtime -1 \
-exec mv {} $BACKUP_ROOT/daily/ \;
# Weekly (วันอาทิตย์)
if [ "$DAY_OF_WEEK" -eq 7 ]; then
cp $BACKUP_ROOT/daily/* $BACKUP_ROOT/weekly/ 2>/dev/null || true
fi
# Monthly (วันที่ 1)
if [ "$DAY_OF_MONTH" -eq 01 ]; then
cp $BACKUP_ROOT/daily/* $BACKUP_ROOT/monthly/ 2>/dev/null || true
fi
# Retention Policy
ls -tp $BACKUP_ROOT/daily | grep -v '/$' | tail -n +8 | \
xargs -I {} rm -- $BACKUP_ROOT/daily/{} # เก็บ 7 daily
ls -tp $BACKUP_ROOT/weekly | grep -v '/$' | tail -n +5 | \
xargs -I {} rm -- $BACKUP_ROOT/weekly/{} # เก็บ 4 weekly
ls -tp $BACKUP_ROOT/monthly | grep -v '/$' | tail -n +4 | \
xargs -I {} rm -- $BACKUP_ROOT/monthly/{} # เก็บ 3 monthly
# Upload to S3 (encrypted)
aws s3 sync $BACKUP_ROOT $S3_BUCKET --delete --sse AES256
echo "==== Backup completed at $(date) ====" >> $LOG_FILE