Otomatisasi backup server Linux dan pemeriksaan kesehatan independen

Operasi server yang andal memerlukan backup yang dapat dipulihkan serta pemeriksaan yang mendeteksi gangguan. Verifikasi pembuatan arsip, integritas, pemulihan, respons HTTP, dan ruang penyimpanan secara terpisah, lalu sediakan cara dari luar server untuk mendeteksi kegagalan ataupun pekerjaan yang tidak pernah berjalan.

Hubungkan prosedur yang sudah lulus verifikasi backup dan pemulihan manual dengan penjadwalan eksekusi. Pembuatan backup, pemulihan ke lokasi terpisah, dan pelaporan kegagalan merupakan pemeriksaan yang berbeda.

Acuan konfigurasi adalah mesin virtual (VM) dengan instalasi biasa Ubuntu 26.04 LTS, yaitu rilis dukungan jangka panjang, atau Rocky Linux seri 9. Layanan dan paket pada kontainer, Windows Subsystem for Linux (WSL), dan rilis lain dapat berbeda. Siapkan konsol pemulihan dan catat versi sesuai panduan persiapan VM berbahasa Inggris.

Menentukan data dan lingkup pemulihan

Contoh ini menangani berkas statis biasa yang perubahannya dikendalikan, seperti konten situs pada latihan Nginx. Cadangkan konfigurasi layanan, sertifikat, informasi DNS, dan prosedur deployment secara terpisah. Untuk basis data, gunakan alat yang menjamin konsistensi aplikasi. Arsip lokal berikut mengajarkan alur kerja, tetapi tidak menjadi perlindungan mandiri terhadap kerusakan disk atau kompromi akun.

Pilih sumber yang dapat dibaca dan direktori backup privat yang dapat ditulisi oleh pengguna latihan. Jangan menjadwalkan semuanya sebagai root hanya untuk melewati pembatasan baca. Backup produksi memerlukan akun yang dipilih dengan sengaja, jalur yang diizinkan, pengelolaan kunci enkripsi, dan kebijakan retensi.

Membuat skrip backup dengan sumber dan tujuan eksplisit

Contoh Bash ini memerlukan realpath, mktemp, tar dengan dukungan gzip, sha256sum, dan date. Direktori sumber serta tujuan harus sudah ada. Tujuan tidak boleh sama dengan atau berada di dalam sumber, dan akar sistem berkas / sengaja ditolak sebagai sumber latihan. Tanda && menghubungkan langkah yang hanya boleh berjalan setelah langkah sebelumnya berhasil.

Periksa dahulu bahwa $HOME/bin/course-backup.sh belum digunakan. Noclobber melalui set -C menolak penimpaan skrip yang sudah ada; jika terjadi penolakan, periksa dan cadangkan berkas itu, kemudian pilih nama lain secara konsisten. Jangan menghapus skrip yang belum diketahui asalnya.

mkdir -p "$HOME/bin" &&
(
set -C
cat > "$HOME/bin/course-backup.sh" <<'EOF'
#!/usr/bin/env bash
set -u
set -o pipefail
umask 077
if (( $# != 2 )); then
  printf "Usage: %s SOURCE_DIRECTORY BACKUP_DIRECTORY\n" "$0" >&2
  exit 2
fi
source_dir=$(realpath -e -- "$1") || exit 1
backup_dir=$(realpath -e -- "$2") || exit 1
[[ -d "$source_dir" && -d "$backup_dir" ]] || exit 1
[[ "$source_dir" != / ]] || { printf "Root directory is not a lab source\n" >&2; exit 1; }
case "$backup_dir/" in
  "$source_dir/"*) printf "Backup must be outside source\n" >&2; exit 1 ;;
esac
work=$(mktemp -d "$backup_dir/backup.XXXXXXXX") || exit 1
if ! tar -czf "$work/data.tar.gz" -C "$source_dir" .; then
  printf "Archive failed: %s\n" "$work" >&2; exit 1
fi
if ! tar -tzf "$work/data.tar.gz" > /dev/null; then
  printf "Archive listing failed\n" >&2; exit 1
fi
if ! (cd "$work" && sha256sum data.tar.gz > data.tar.gz.sha256); then
  printf "Checksum creation failed\n" >&2; exit 1
fi
if ! date --iso-8601=seconds > "$work/created-at.txt"; then exit 1; fi
printf "complete\n" > "$work/COMPLETE" || exit 1
printf "Backup ready: %s\n" "$work"
EOF
) &&
bash -n "$HOME/bin/course-backup.sh"

Setiap eksekusi membuat direktori unik agar dua pekerjaan tidak memilih nama arsip yang sama. Berkas COMPLETE baru ditulis setelah pembuatan arsip, pembacaan daftar isinya, checksum SHA-256, dan pencatatan waktu berhasil. SHA-256 adalah fungsi hash untuk memeriksa apakah byte arsip berubah. Direktori parsial dapat tertinggal jika pekerjaan gagal; jangan menghitungnya sebagai titik pemulihan yang selesai.

Penanda COMPLETE menyatakan urutan pembuatan telah selesai, bukan bahwa data tidak akan rusak kemudian. Periksa checksum dan lakukan pemulihan terpisah. Skrip mencatat waktu pembuatan, tetapi tidak menghapus backup lama secara otomatis atau memberi jaminan konsistensi untuk berkas yang terus berubah.

Menguji pembuatan, integritas, dan pemulihan secara terpisah

Jalankan blok berikut pada shell Bash yang sama dengan blok pemulihan setelahnya. Direktori lab dibuat baru, dan setiap langkah berhenti bila pendahulunya gagal.

lab=$(mktemp -d "$HOME/linux-ops-lab.XXXXXX") &&
mkdir "$lab/site" "$lab/backups" "$lab/restored" &&
printf "site version 1\n" > "$lab/site/index.html" &&
bash "$HOME/bin/course-backup.sh" "$lab/site" "$lab/backups" &&
find "$lab/backups" -maxdepth 2 -type f -print

Ganti ACTUAL_BACKUP_DIRECTORY pada baris berikut dengan direktori dari keluaran Backup ready: untuk eksekusi ini. Kutip jalur jika mengandung spasi. Periksa bahwa direktori restored masih kosong. Checksum dan daftar isi arsip tar yang lolos belum membuktikan aplikasi dapat dipulihkan; bandingkan konten hasil ekstraksi dan uji layanan sebenarnya secara terpisah.

backup=ACTUAL_BACKUP_DIRECTORY &&
test -f "$backup/COMPLETE" &&
(cd "$backup" && sha256sum -c data.tar.gz.sha256) &&
tar -xzf "$backup/data.tar.gz" -C "$lab/restored" &&
diff -r "$lab/site" "$lab/restored"

Hasil yang diharapkan adalah penanda COMPLETE tersedia, checksum menampilkan OK, dan diff tidak menampilkan perbedaan. Rangkaian && mencegah ekstraksi dilanjutkan jika penanda atau checksum gagal. Jangan memakai arsip yang tidak dipercaya untuk latihan ini.

Periksa juga izin, pemilik, dan label yang dibutuhkan setelah pemulihan. Ulangi pemeriksaan integritas serta pemulihan setelah arsip dipindahkan ke penyimpanan independen. Terapkan retensi yang mempertahankan titik pemulihan yang diperlukan, bukan menghapus semua salinan lama tanpa pertimbangan ketika ruang menipis.

Membuat pemeriksaan HTTP dan ruang penyimpanan

Skrip berikut memerlukan curl, df, dan awk, serta direktori bin dari langkah sebelumnya. Ia menerima URL, ambang ruang bebas dalam KiB, dan jalur penyimpanan yang diperiksa. HTTP 200–299 dianggap sehat; sesuaikan kriteria jika layanan memang melakukan redirect atau memerlukan autentikasi. Skrip tidak memeriksa kebenaran isi halaman, kesehatan basis data, ataupun seluruh fungsi aplikasi.

Input numerik dibatasi satu hingga 18 digit desimal, termasuk nol di depan, untuk menghindari masukan yang melampaui perhitungan integer contoh ini. Angka dengan format lain ditolak. Seperti skrip backup, pembuatan skrip menolak menimpa berkas yang sudah ada.

(
set -C
cat > "$HOME/bin/course-health.sh" <<'EOF'
#!/usr/bin/env bash
set -u
set -o pipefail
if (( $# != 3 )); then
  printf "Usage: %s URL MIN_FREE_KIB STORAGE_PATH\n" "$0" >&2; exit 2
fi
url=$1
minimum=$2
path=$3
[[ "$minimum" =~ ^[0-9]{1,18}$ ]] || exit 2
if ! status=$(curl -sS -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 15 "$url"); then
  printf "HTTP transport failed\n" >&2; exit 1
fi
[[ "$status" =~ ^2[0-9][0-9]$ ]] || { printf "HTTP status=%s\n" "$status" >&2; exit 1; }
available=$(df -Pk -- "$path" | awk 'NR==2 {print $4}') || exit 1
[[ "$available" =~ ^[0-9]{1,18}$ ]] || exit 1
(( 10#$available >= 10#$minimum )) || { printf "Low storage: %s KiB\n" "$available" >&2; exit 1; }
printf "OK http=%s free_kib=%s\n" "$status" "$available"
EOF
) &&
bash -n "$HOME/bin/course-health.sh" &&
bash "$HOME/bin/course-health.sh" http://127.0.0.1/ 102400 "$HOME"

Nilai 102400 KiB sama dengan 100 MiB dan hanya merupakan ambang latihan, bukan rekomendasi operasional. Tentukan ambang berdasarkan laju pertumbuhan serta ruang yang dibutuhkan saat pemulihan, dan periksa inode secara terpisah. Satuan keluaran df -Pk adalah blok 1024 byte dengan bentuk keluaran portabel.

Pada contoh, koneksi memiliki batas lima detik dan keseluruhan transfer 15 detik. Curl dapat berhasil melakukan transfer walaupun server mengembalikan HTTP 404; karena itu skrip juga memeriksa kode HTTP secara eksplisit. Redirect tidak otomatis diikuti. Untuk situs Nginx berbasis nama, periksa URL domain atau routing Host yang benar: respons 200 dari situs bawaan belum memvalidasi situs tujuan.

Menjadwalkan pekerjaan dan mendeteksi kegagalan dari luar

Gunakan struktur service dan timer pengguna pada panduan penjadwalan, dengan ExecStart yang memanggil /bin/bash %h/bin/course-backup.sh ACTUAL_SOURCE ACTUAL_BACKUP_PATH. Ganti kedua placeholder dengan jalur nyata. Jika mengandung spasi, kutip setiap argumen sesuai sintaks systemd; ExecStart bukan baris shell biasa. Uji dahulu perintah secara manual dengan lingkungan dan akun yang akan menjalankannya.

Pilih jadwal berdasarkan kebutuhan pemulihan dan perubahan data, lalu gunakan unit terpisah untuk pemeriksaan kesehatan. Periksa pemicu berikutnya, status keluar layanan, dan waktu backup terakhir yang benar-benar selesai secara terpisah. Perilaku timer pengguna saat logout dan setelah reboot juga harus sesuai kebijakan sistem.

Monitor pada server yang sama ikut berhenti ketika server berhenti. Monitor eksternal perlu memeriksa URL sebenarnya serta kesegaran backup. Uji jalur penerimaan email atau pesan jika digunakan, termasuk apakah pekerjaan yang tidak berjalan dapat terdeteksi, dan tentukan siapa yang bertindak serta bagaimana pemulihan dilakukan untuk setiap kegagalan yang memerlukan tindakan.

Menguji kegagalan dan membersihkan latihan

Ubah satu kondisi setiap kali: sumber backup yang tidak ada, sumber HTTP yang tidak ditemukan, dan ambang ruang bebas yang sengaja terlalu tinggi. Setelah setiap uji, pulihkan nilai semula dan pastikan pemeriksaan kembali berhasil. Pastikan direktori tanpa COMPLETE tidak dilaporkan sebagai backup selesai; jika checksum gagal, penanda yang masih ada tidak membuat arsip itu layak dipakai.

Hentikan dan nonaktifkan timer latihan sebelum menghapus hanya skrip serta direktori kerja yang dibuat untuk latihan ini. Jangan menghapus backup operasional atau konfigurasi penjadwalan lain. Simpan bukti yang masih diperlukan untuk penelusuran.

Dokumentasi resmi