#!/usr/bin/env bash set -euo pipefail APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$APP_DIR" PHP_BIN="${PHP_BIN:-php}" BACKUP_ROOT="${BACKUP_ROOT:-$APP_DIR/storage/app/backups-manual}" TIMESTAMP="$(date '+%Y-%m-%d-%H%M%S')" RETENTION_DAYS="${RETENTION_DAYS:-14}" log() { printf '\n[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" } abort() { printf '\n[ERROR] %s\n' "$1" >&2 exit 1 } [[ -f .env ]] || abort "File .env tidak ditemukan." [[ -f artisan ]] || abort "File artisan tidak ditemukan. Jalankan dari root project Laravel." mkdir -p "$BACKUP_ROOT/database" mkdir -p "$BACKUP_ROOT/storage" mkdir -p "$BACKUP_ROOT/env" DB_CONNECTION=$(grep '^DB_CONNECTION=' .env | cut -d '=' -f2- | tr -d '"') DB_HOST=$(grep '^DB_HOST=' .env | cut -d '=' -f2- | tr -d '"') DB_PORT=$(grep '^DB_PORT=' .env | cut -d '=' -f2- | tr -d '"') DB_DATABASE=$(grep '^DB_DATABASE=' .env | cut -d '=' -f2- | tr -d '"') DB_USERNAME=$(grep '^DB_USERNAME=' .env | cut -d '=' -f2- | tr -d '"') DB_PASSWORD=$(grep '^DB_PASSWORD=' .env | cut -d '=' -f2- | tr -d '"') [[ -n "$DB_CONNECTION" ]] || abort "DB_CONNECTION tidak ditemukan di .env" [[ "$DB_CONNECTION" == "mysql" ]] || abort "backup.sh saat ini hanya mendukung DB_CONNECTION=mysql" [[ -n "$DB_DATABASE" ]] || abort "DB_DATABASE tidak ditemukan di .env" [[ -n "$DB_USERNAME" ]] || abort "DB_USERNAME tidak ditemukan di .env" DB_HOST="${DB_HOST:-127.0.0.1}" DB_PORT="${DB_PORT:-3306}" DB_FILE="$BACKUP_ROOT/database/${DB_DATABASE}-${TIMESTAMP}.sql" STORAGE_FILE="$BACKUP_ROOT/storage/storage-public-${TIMESTAMP}.tar.gz" ENV_FILE="$BACKUP_ROOT/env/env-${TIMESTAMP}.backup" log "Backup database: $DB_DATABASE" MYSQL_PWD="$DB_PASSWORD" mysqldump \ --host="$DB_HOST" \ --port="$DB_PORT" \ --user="$DB_USERNAME" \ --single-transaction \ --quick \ --skip-lock-tables \ "$DB_DATABASE" > "$DB_FILE" log "Backup storage/app/public" tar -czf "$STORAGE_FILE" storage/app/public log "Backup file .env" cp .env "$ENV_FILE" chmod 600 "$ENV_FILE" || true log "Hapus backup lama di atas ${RETENTION_DAYS} hari" find "$BACKUP_ROOT" -type f -mtime +"$RETENTION_DAYS" -delete || true log "Backup selesai" printf '\nHasil backup:\n' printf -- '- Database: %s\n' "$DB_FILE" printf -- '- Storage : %s\n' "$STORAGE_FILE" printf -- '- .env : %s\n' "$ENV_FILE"