#!/usr/bin/env bash
# Mediops — ежедневный dump MySQL/MariaDB + gzip + retention
# Гайд: https://mediops.ru/guides/bekapy-bazy-ezhednevno.html
# Пароль НЕ храните в git. Лучше: ~/.my.cnf (chmod 600) или MYSQL_PWD только в cron env.
set -euo pipefail

# === настройте под сервер ===
DB_HOST="${DB_HOST:-127.0.0.1}"
DB_PORT="${DB_PORT:-3306}"
DB_USER="${DB_USER:-backup_user}"
DB_NAME="${DB_NAME:-bitrix}"
BACKUP_DIR="${BACKUP_DIR:-/var/backups/mysql}"
KEEP_DAYS="${KEEP_DAYS:-14}"
# опционально: export MYSQL_PWD='...'  или defaults-file ниже
DEFAULTS_FILE="${DEFAULTS_FILE:-}"

STAMP="$(date +%Y%m%d_%H%M%S)"
OUT="${BACKUP_DIR}/${DB_NAME}_${STAMP}.sql.gz"
LOG="${BACKUP_DIR}/backup.log"

mkdir -p "$BACKUP_DIR"
touch "$LOG"

AUTH_ARGS=()
if [[ -n "$DEFAULTS_FILE" ]]; then
  AUTH_ARGS+=(--defaults-extra-file="$DEFAULTS_FILE")
fi

{
  echo "[$(date -Is)] start ${DB_NAME} → ${OUT}"
  mysqldump "${AUTH_ARGS[@]}" \
    -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" \
    --single-transaction --routines --triggers --events \
    --default-character-set=utf8mb4 \
    "$DB_NAME" | gzip -c > "$OUT"

  # битый gzip / пустой файл — ошибка
  gzip -t "$OUT"
  SIZE="$(stat -c%s "$OUT" 2>/dev/null || stat -f%z "$OUT")"
  if [[ "$SIZE" -lt 200 ]]; then
    echo "[$(date -Is)] ERROR: dump too small (${SIZE} bytes)" >&2
    rm -f "$OUT"
    exit 1
  fi

  # retention
  find "$BACKUP_DIR" -maxdepth 1 -type f -name "${DB_NAME}_*.sql.gz" -mtime +"${KEEP_DAYS}" -delete
  echo "[$(date -Is)] ok size=${SIZE} keep=${KEEP_DAYS}d"
} >>"$LOG" 2>&1
