Backup, Restore & Reset Server

Panduan lengkap untuk backup database, restore, penjadwalan otomatis, dan reset server ujian.

Backup Database

Backup Manual

# Backup ke lokasi default (/root/backup_db/)
examtool backup-db

# Backup ke lokasi lain
examtool backup-db --path=/mnt/external/backup

File backup diberi nama otomatis: backup_db_ujian_YYYYMMDD_HHMMSS.sql.gz

Contoh output:

[  OK  ] Backup berhasil: /root/backup_db/backup_db_ujian_20260701_140000.sql.gz (12M)

Kapan Harus Backup

  • Sebelum update aplikasi: examtool backup-full && examtool update
  • Sebelum ujian penting: examtool backup-full --path=/root/backup_ujian_penting
  • Sebelum reconfigure: examtool backup-full && examtool reconfigure ...
  • Rutin harian: gunakan scheduler otomatis (lihat di bawah)

Full Backup (Database + Aplikasi)

Backup database dan file aplikasi sekaligus dalam satu direktori:

# Backup ke lokasi default (/root/backup_full/)
examtool backup-full

# Backup ke lokasi lain
examtool backup-full --path=/mnt/external/backup

Menghasilkan dua file dalam satu direktori:

  • backup_db_ujian_YYYYMMDD_HHMMSS.sql.gz — database
  • backup_app_ujian_YYYYMMDD_HHMMSS.tar.gz — aplikasi + config

Rekomendasi: Gunakan backup-full sebelum update besar atau ujian penting. Satu command mencakup seluruh server.

Restore Database

Restore dari File Compressed (.sql.gz)

examtool restore-db --file=/root/backup_db/backup_db_ujian_20260701_140000.sql.gz

Restore dari File SQL (.sql)

examtool restore-db --file=/root/backup_db/backup.sql

Langkah Restore Aman

  1. Backup dulu database yang sedang aktif (jaga-jaga):

    examtool backup-db --path=/root/backup_sebelum_restore
    
  2. Restore dari file backup:

    examtool restore-db --file=/root/backup_db/backup_yang_diinginkan.sql.gz
    
  3. Verifikasi data sudah benar:

    mysql -u root -e "USE cbt_kedokteran; SHOW TABLES; SELECT COUNT(*) FROM users;"
    
  4. Restart PHP-FPM untuk membersihkan cache:

    systemctl restart php8.3-fpm
    

Catatan: Restore akan menimpa seluruh isi database. Pastikan Anda sudah backup database aktif sebelum restore.

Restore Aplikasi

Restore file aplikasi dan konfigurasi dari backup backup-app:

examtool restore-app --file=/root/backup_app/backup_app_ujian_20260701_140000.tar.gz

Ownership file otomatis diperbaiki ke www-data setelah extract.

Catatan: Setelah restore aplikasi, restart PHP-FPM dan Nginx untuk memuat konfigurasi baru:

systemctl restart php8.3-fpm nginx

Full Restore (Database + Aplikasi)

Restore database dan aplikasi sekaligus:

examtool restore-full \
    --file-db=/root/backup_full/backup_db_ujian_20260701_140000.sql.gz \
    --file-app=/root/backup_full/backup_app_ujian_20260701_140000.tar.gz
Parameter Wajib Keterangan
--file-db Ya File backup database (.sql atau .sql.gz)
--file-app Ya File backup aplikasi (.tar.gz)

Langkah Full Restore Aman

  1. Backup dulu kondisi saat ini:

    examtool backup-full --path=/root/backup_sebelum_restore
    
  2. Restore dari backup:

    examtool restore-full \
        --file-db=/root/backup_full/backup_db_ujian_xxx.sql.gz \
        --file-app=/root/backup_full/backup_app_ujian_xxx.tar.gz
    
  3. Restart services:

    systemctl restart php8.3-fpm nginx
    
  4. Verifikasi aplikasi dan database:

    examtool status
    

Scheduler Backup Otomatis

Setup Cron Harian

Gunakan perintah interaktif:

examtool enable-backup-cron

Anda akan ditanya:

Pertanyaan Default Keterangan
Jam backup 2 Jam 0-23 (rekomendasi: dini hari saat tidak ada ujian)
Menit backup 0 Menit 0-59
Direktori backup /root/backup_db Path tujuan backup
Retensi 7 hari Backup lebih lama dari ini otomatis dihapus (0 = simpan semua)

Contoh interaksi:

[ INFO ] Setup backup database otomatis (cron harian)

Jam backup (0-23, default: 2): 3
Menit backup (0-59, default: 0): 30
Direktori backup (default: /root/backup_db): /root/backup_db
Hapus backup lebih dari berapa hari? (0=tidak dihapus, default: 7): 14

  Jadwal  : Setiap hari jam 03:30 WIB
  Path    : /root/backup_db
  Retensi : 14 hari (backup lama otomatis dihapus)

Pasang cron backup harian? (y/N): y
[  OK  ] Cron backup harian berhasil dipasang

Cek Cron Aktif

# Lihat cron yang terpasang
crontab -l

# Lihat log backup
tail -20 /var/log/examtool-backup-cron.log

Hapus Cron

examtool disable-backup-cron

Tips Scheduler

  • Jam backup: pilih jam dini hari saat tidak ada ujian (02:00 - 04:00)
  • Retensi 7 hari: cukup untuk recovery dari error yang terdeteksi dalam seminggu
  • Retensi 30 hari: untuk lingkungan produksi dengan ujian penting
  • Retensi 0 (simpan semua): hanya jika disk cukup besar, pantau disk usage
  • Backup sebelum ujian: jalankan examtool backup-db manual selain cron, simpan ke path terpisah

Pindahkan Backup ke External

Cron hanya menyimpan backup di server. Untuk keamanan ekstra, pindahkan secara berkala ke storage lain:

# Copy ke server lain via SCP
scp /root/backup_db/backup_db_ujian_*.sql.gz user@backup-server:/backups/

# Atau sync ke external drive
rsync -av /root/backup_db/ /mnt/external/backup_ujian/

Uninstall (Reset Server)

Uninstall Konfigurasi

Untuk menghapus semua konfigurasi server ujian dan memulai dari awal:

examtool uninstall --confirm

Flag --confirm wajib untuk mencegah penghapusan tidak sengaja. Setelah itu masih akan muncul konfirmasi sekali lagi.

Yang Dihapus

Komponen Detail
Konfigurasi Nginx vhost ujian, rate limiting, sites-enabled
Konfigurasi PHP-FPM pool ujian
Konfigurasi MariaDB tuning file
Fail2ban jail examtool, custom filter
Aplikasi /var/www/ujian/ dan /var/www/rasch/
SSL /etc/ssl/ujian/
System tuning sysctl dan limits config
Log rotation config logrotate examtool
Config files /etc/examtool.conf dan /etc/examtool.env
Firewall UFW rules di-reset

Yang TIDAK Dihapus

Komponen Alasan
Packages (nginx, mariadb, php, dll) Butuh apt purge manual
Database MariaDB Data masih ada di /var/lib/mysql/
Backup di /root/backup_db/ Sengaja dipertahankan
Final backup Otomatis disimpan di /root/examtool-final-backup/
Script examtool /usr/local/bin/examtool tetap ada
Cron backup Jika ada, hapus dulu dengan examtool disable-backup-cron

Clean Install (Ulang dari Awal)

Untuk install ulang sepenuhnya, ikuti langkah berikut:

Langkah 1: Hapus cron backup (jika ada)

examtool disable-backup-cron

Langkah 2: Full backup (opsional tapi disarankan)

examtool backup-full --path=/root/backup_sebelum_reset

Langkah 3: Hapus monitoring (jika ada)

examtool remove-monitoring --confirm

Langkah 4: Uninstall

examtool uninstall --confirm

Langkah 5: (Opsional) Hapus packages jika ingin benar-benar bersih

apt purge -y nginx* php8.3* mariadb-server* memcached fail2ban dnsmasq
apt autoremove -y

# Hapus data MariaDB (HATI-HATI: semua database hilang!)
rm -rf /var/lib/mysql/

Langkah 6: Update examtool ke versi terbaru

examtool self-update

Langkah 7: Install ulang

examtool install \
    --domain=demo.ujiancbt.online \
    --client=200 \
    --file-crt=/root/ssl/ujian.crt \
    --file-key=/root/ssl/ujian.key \
    --username=webdev01 \
    --password=Rahasia123

Langkah 8: Restore database (jika ingin data lama)

examtool restore-db --file=/root/backup_sebelum_reset/backup_db_ujian_XXXXXXXX_XXXXXX.sql.gz

Langkah 9: Setup monitoring kembali (opsional)

examtool setup-monitoring

Langkah 10: Setup backup cron kembali

examtool enable-backup-cron

Catatan Penting

  • Uninstall otomatis membuat final backup di /root/examtool-final-backup/ sebelum menghapus apapun
  • Setelah apt purge mariadb-server, data di /var/lib/mysql/ masih ada sampai dihapus manual
  • SSL certificate dan key perlu disiapkan kembali untuk install ulang
  • Password database akan di-generate ulang saat install ulang (cek /etc/examtool.env)