#!/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"