feat: add server-side backup scripts and restore guide
This commit is contained in:
Executable
+65
@@ -0,0 +1,65 @@
|
||||
#!/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"
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
BACKUP_ROOT="${BACKUP_ROOT:-/var/backups/database-kesiswaan}"
|
||||
TIMESTAMP="${TIMESTAMP:-$(date '+%Y-%m-%d-%H%M%S')}"
|
||||
RETENTION_DAYS="${RETENTION_DAYS:-14}"
|
||||
SOURCE_DIR="${SOURCE_DIR:-$APP_DIR/storage/app/public}"
|
||||
|
||||
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."
|
||||
}
|
||||
|
||||
[[ -d "$SOURCE_DIR" ]] || abort "Folder sumber dokumen tidak ditemukan di $SOURCE_DIR"
|
||||
require_bin tar
|
||||
|
||||
TARGET_DIR="$BACKUP_ROOT/files"
|
||||
mkdir -p "$TARGET_DIR"
|
||||
TARGET_FILE="$TARGET_DIR/storage-public-${TIMESTAMP}.tar.gz"
|
||||
|
||||
log "Memulai backup dokumen dari '$SOURCE_DIR'"
|
||||
tar -czf "$TARGET_FILE" -C "$SOURCE_DIR" .
|
||||
|
||||
find "$TARGET_DIR" -type f -name '*.tar.gz' -mtime +"$RETENTION_DAYS" -delete || true
|
||||
|
||||
log "Backup dokumen selesai: $TARGET_FILE"
|
||||
printf '%s\n' "$TARGET_FILE"
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
BACKUP_ROOT="${BACKUP_ROOT:-/var/backups/database-kesiswaan}"
|
||||
ENV_FILE="${ENV_FILE:-$APP_DIR/.env}"
|
||||
TIMESTAMP="${TIMESTAMP:-$(date '+%Y-%m-%d-%H%M%S')}"
|
||||
RETENTION_DAYS="${RETENTION_DAYS:-14}"
|
||||
KEEP_ENV_BACKUP="${KEEP_ENV_BACKUP:-true}"
|
||||
|
||||
abort() {
|
||||
printf '[ERROR] %s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
log() {
|
||||
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
|
||||
}
|
||||
|
||||
[[ -f "$ENV_FILE" ]] || abort "File .env tidak ditemukan di $ENV_FILE"
|
||||
|
||||
mkdir -p "$BACKUP_ROOT/manifests" "$BACKUP_ROOT/env"
|
||||
|
||||
DB_BACKUP="$(BACKUP_ROOT="$BACKUP_ROOT" ENV_FILE="$ENV_FILE" TIMESTAMP="$TIMESTAMP" RETENTION_DAYS="$RETENTION_DAYS" "$APP_DIR/scripts/backup-database-kesiswaan.sh")"
|
||||
FILES_BACKUP="$(BACKUP_ROOT="$BACKUP_ROOT" TIMESTAMP="$TIMESTAMP" RETENTION_DAYS="$RETENTION_DAYS" "$APP_DIR/scripts/backup-dokumen-kesiswaan.sh")"
|
||||
ENV_BACKUP=""
|
||||
|
||||
if [[ "$KEEP_ENV_BACKUP" == "true" ]]; then
|
||||
ENV_BACKUP="$BACKUP_ROOT/env/env-${TIMESTAMP}.backup"
|
||||
cp "$ENV_FILE" "$ENV_BACKUP"
|
||||
chmod 600 "$ENV_BACKUP" || true
|
||||
find "$BACKUP_ROOT/env" -type f -name '*.backup' -mtime +"$RETENTION_DAYS" -delete || true
|
||||
fi
|
||||
|
||||
MANIFEST_FILE="$BACKUP_ROOT/manifests/backup-${TIMESTAMP}.txt"
|
||||
{
|
||||
echo "timestamp=$TIMESTAMP"
|
||||
echo "database_backup=$DB_BACKUP"
|
||||
echo "files_backup=$FILES_BACKUP"
|
||||
echo "env_backup=${ENV_BACKUP:-not_saved}"
|
||||
echo "host=$(hostname)"
|
||||
echo "app_dir=$APP_DIR"
|
||||
} > "$MANIFEST_FILE"
|
||||
|
||||
find "$BACKUP_ROOT/manifests" -type f -name 'backup-*.txt' -mtime +"$RETENTION_DAYS" -delete || true
|
||||
|
||||
log "Backup penuh selesai"
|
||||
printf 'Database: %s\n' "$DB_BACKUP"
|
||||
printf 'Dokumen : %s\n' "$FILES_BACKUP"
|
||||
if [[ -n "$ENV_BACKUP" ]]; then
|
||||
printf '.env : %s\n' "$ENV_BACKUP"
|
||||
fi
|
||||
printf 'Manifest: %s\n' "$MANIFEST_FILE"
|
||||
Reference in New Issue
Block a user