BelajarDev merupakan bagian dari eksperimen Muhammad Ikhsan di Smartech Studios.
Backup Script — Auto Backup ke Google Drive (`gdrive` + `cron`)
Catatan penjelasan detail terkait penggunaan gdrive untuk auto-backup bisa dilihat di:
Server Backup — Upload Otomatis ke Google Drive pakai gdrive dan cron
Requirement
Kebutuhan:
- Perlu backup folder
/var/www/htmlke Google Drive secara berkala - Perlu backup local di
/tmp - Nama unik file backup menggunakan timestamp (tidak overwrite file backup yg lama)
- Retensi: 7 hari (bisa disesuaikan di script)
- Backup baik di lokal maupun di Google Drive dihapus setelah masa retensi
- Log disimpan di
/var/log/backup-gdrive.log - Kirim email notifikasi jika backup gagal
Script
File script /usr/local/bin/backup-gdrive.sh
#!/bin/bash
# Exit kalau error
set -e
# ==============================
# KONFIGURASI
# ==============================
BACKUP_DIR="/tmp"
SOURCE_DIR="/var/www/html"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/backup_html_$DATE.tar.gz"
GDRIVE_FOLDER_ID="<FOLDER_ID>"
LOG_FILE="/var/log/backup-gdrive.log"
RETENTION_DAYS=7
ADMIN_EMAIL="admin@example.com"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
notify_failure() {
echo "$1" | mail -s "Backup Server Gagal" "$ADMIN_EMAIL"
}
cleanup_old_local_backups() {
find "$BACKUP_DIR" -name "backup_html_*.tar.gz" -mtime +$RETENTION_DAYS -delete
}
delete_old_gdrive_backups() {
gdrive list --query "name contains 'backup_html_'" | \
awk 'NR > 1 {print $1}' | \
tail -n +8 | \
xargs -I {} gdrive delete {}
}
{
log "Backup dimulai"
# Buat file archive
tar -czf "$BACKUP_FILE" "$SOURCE_DIR"
# Upload ke Google Drive
gdrive upload --parent "$GDRIVE_FOLDER_ID" "$BACKUP_FILE"
# Hapus file backup yang sudah melewati masa retensi RETENTION_DAYS
cleanup_old_local_backups
delete_old_gdrive_backups
log "Backup berhasil: $BACKUP_FILE"
} || {
log "Backup gagal"
notify_failure "Proses backup gagal pada $(date)"
exit 1
}
Catatan:
- Contoh tanggal yang dihasilkan
DATE=$(date +"%Y-%m-%d_%H-%M-%S"):2026-05-02_02-00-00.tar.gz, sehingga nama file menjadi (misalnya)backup_html_2026-05-02_02-00-00.tar.gz - Perlu
chmod +x /usr/local/bin/backup-gdrive.sh - Ganti nilai
RETENTION_DAYSuntuk mengganti retention (berapa lama file backup lama tetap disimpan, hingga kemudian akan dihapus pada putaran jadwal backup berikutnya) - Untuk notifikasi email, mungkin perlu install mail utility:
sudo apt install mailutils - Kalau ingin notifikasi yang lebih modern, bisa tambahkan atau ganti dengan integrasi (misalnya):
- Slack Webhook
- Discord Webhook
- Telegram Bot
- Contoh notifikasi Telegram:
curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage \ -d chat_id=<CHAT_ID> \ -d text="Backup server gagal"
- Contoh notifikasi Telegram:
- Sebelum dibiarkan berjalan otomatis via
cron, bisa dites dulu:- Jalankan scriptnya:
/usr/local/bin/backup-gdrive.sh - Cek log:
tail -f /var/log/backup.log - Pastikan berjalan sesuai requirement
- Jalankan scriptnya:
Cron
Perintah di cronjob:
0 2 * * * /usr/local/bin/backup-gdrive.sh
Catatan:
Script akan dijalankan setiap hari pada pukul 02:00 (menit ke 0, jam ke 2).
Biasanya pada jam segitu, traffic server lebih rendah sehingga proses backup bisa berjalan lebih cepat dan minim gangguan ke user.
┌──────── menit (0 - 59)
│ ┌────── jam (0 - 23)
│ │ ┌──── hari dalam bulan (1 - 31)
│ │ │ ┌── bulan (1 - 12)
│ │ │ │ ┌─ hari dalam minggu (0 - 7, 0 & 7 = Minggu)
│ │ │ │ │
│ │ │ │ │
0 2 * * * command
Bisa diganti misalnya:
0 2 * * 0 command: setiap Hari Minggu pukul 02:00 (seminggu sekali)0 */6 * * * command: setiap 6 jam, yaitu pada pukul 00:00 (= 24:00), 06:00, 12:00, dan 18:000 * * * * command: setiap jam pada menit ke 0, misalnya 00:00, 01:00, 02:00, 03:00, dst.
Cron tidak peduli kapan terakhir dijalankan.
Dia hanya cek:
“apakah waktu sekarang cocok dengan pola?”
Makanya:
*/6selalu fixed di jam 0,6,12,18- bukan 6 jam dari waktu terakhir cron diupdate/dijalankan