42 lines
1.2 KiB
Bash
42 lines
1.2 KiB
Bash
#!/usr/bin/env bash
|
|
# Backup SQLite database — копирует .db файл с timestamp в директорию бэкапов.
|
|
# Вызывается из systemd timer или cron.
|
|
#
|
|
# Использование: ./scripts/backup-db.sh [path-to-db] [backup-dir] [retention-days]
|
|
# По умолчанию: db=server/prisma/prod.db, backup=server/backups, retention=30
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
|
|
DB_PATH="${1:-$ROOT/server/prisma/prod.db}"
|
|
BACKUP_DIR="${2:-$ROOT/server/backups}"
|
|
RETENTION_DAYS="${3:-30}"
|
|
|
|
if [[ ! -f "$DB_PATH" ]]; then
|
|
echo "[$(date -Iseconds)] DB not found: $DB_PATH" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
BACKUP_FILE="$BACKUP_DIR/craftshop_${TIMESTAMP}.db"
|
|
|
|
# SQLite-safe copy: use .backup to avoid copying a file mid-write
|
|
if command -v sqlite3 &>/dev/null; then
|
|
sqlite3 "$DB_PATH" ".backup '$BACKUP_FILE'"
|
|
else
|
|
# Fallback: plain copy (risk of inconsistent state if DB is being written)
|
|
cp "$DB_PATH" "$BACKUP_FILE"
|
|
fi
|
|
|
|
# Compress
|
|
gzip -f "$BACKUP_FILE"
|
|
|
|
# Remove old backups
|
|
find "$BACKUP_DIR" -name 'craftshop_*.db.gz' -mtime +"$RETENTION_DAYS" -delete
|
|
|
|
echo "[$(date -Iseconds)] Backup created: ${BACKUP_FILE}.gz"
|