Files
database-kesiswaan/scripts/backup-database-kesiswaan.sh

66 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${ENV_FILE:-$APP_DIR/.env}"
BACKUP_ROOT="${BACKUP_ROOT:-/var/backups/database-kesiswaan}"
TIMESTAMP="${TIMESTAMP:-$(date '+%Y-%m-%d-%H%M%S')}"
RETENTION_DAYS="${RETENTION_DAYS:-14}"
abort() {
printf '[ERROR] %s\n' "$1" >&2
exit 1
}
log() {
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
}
require_bin() {
command -v "$1" >/dev/null 2>&1 || abort "Binary '$1' tidak ditemukan."
}
read_env() {
local key="$1"
grep -E "^${key}=" "$ENV_FILE" | tail -n 1 | cut -d '=' -f2- | sed 's/^"//; s/"$//'
}
[[ -f "$ENV_FILE" ]] || abort "File .env tidak ditemukan di $ENV_FILE"
require_bin mysqldump
require_bin gzip
DB_CONNECTION="$(read_env DB_CONNECTION)"
DB_HOST="$(read_env DB_HOST)"
DB_PORT="$(read_env DB_PORT)"
DB_DATABASE="$(read_env DB_DATABASE)"
DB_USERNAME="$(read_env DB_USERNAME)"
DB_PASSWORD="$(read_env DB_PASSWORD)"
[[ "$DB_CONNECTION" == "mysql" ]] || abort "Script ini saat ini hanya mendukung DB_CONNECTION=mysql"
[[ -n "$DB_DATABASE" ]] || abort "DB_DATABASE kosong"
[[ -n "$DB_USERNAME" ]] || abort "DB_USERNAME kosong"
DB_HOST="${DB_HOST:-127.0.0.1}"
DB_PORT="${DB_PORT:-3306}"
TARGET_DIR="$BACKUP_ROOT/database"
mkdir -p "$TARGET_DIR"
TARGET_FILE="$TARGET_DIR/${DB_DATABASE}-${TIMESTAMP}.sql.gz"
log "Memulai backup database '$DB_DATABASE'"
MYSQL_PWD="$DB_PASSWORD" mysqldump \
--host="$DB_HOST" \
--port="$DB_PORT" \
--user="$DB_USERNAME" \
--single-transaction \
--quick \
--skip-lock-tables \
--routines \
--triggers \
"$DB_DATABASE" | gzip -c > "$TARGET_FILE"
find "$TARGET_DIR" -type f -name '*.sql.gz' -mtime +"$RETENTION_DAYS" -delete || true
log "Backup database selesai: $TARGET_FILE"
printf '%s\n' "$TARGET_FILE"