-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackup.sh
More file actions
125 lines (108 loc) · 3.89 KB
/
backup.sh
File metadata and controls
125 lines (108 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="${BACKUP_DIR:-/var/backups/sysmon}"
RETENTION_DAYS="${RETENTION_DAYS:-7}"
COMPRESS="${COMPRESS:-true}"
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}"
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
_ts() { date '+%Y%m%d_%H%M%S'; }
_log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; }
_notify() {
[[ -z "$TELEGRAM_BOT_TOKEN" || -z "$TELEGRAM_CHAT_ID" ]] && return 0
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="$TELEGRAM_CHAT_ID" -d text="$1" -d parse_mode="Markdown" > /dev/null 2>&1 || true
}
backup_dir() {
local src="$1"
local name="${2:-$(basename "$src")}"
local dst
dst="${BACKUP_DIR}/${name}_$(_ts)"
mkdir -p "$BACKUP_DIR"
_log "Backing up directory: $src"
if [[ "$COMPRESS" == "true" ]]; then
dst="${dst}.tar.gz"
tar -czf "$dst" -C "$(dirname "$src")" "$(basename "$src")"
else
cp -r "$src" "$dst"
fi
local size
size=$(du -sh "$dst" | cut -f1)
_log "Done: $dst ($size)"
_notify "✅ *Backup complete*: \`$name\` → \`$dst\` ($size)"
}
backup_postgres() {
local db="$1"
local user="${PGUSER:-postgres}"
local dst
dst="${BACKUP_DIR}/pg_${db}_$(_ts).sql"
mkdir -p "$BACKUP_DIR"
_log "Dumping PostgreSQL database: $db"
PGPASSWORD="${PGPASSWORD:-}" pg_dump -U "$user" "$db" > "$dst"
if [[ "$COMPRESS" == "true" ]]; then
gzip "$dst"
dst="${dst}.gz"
fi
local size
size=$(du -sh "$dst" | cut -f1)
_log "Done: $dst ($size)"
_notify "✅ *DB backup complete*: \`$db\` → \`$dst\` ($size)"
}
backup_mysql() {
local db="$1"
local user="${MYSQL_USER:-root}"
local dst
dst="${BACKUP_DIR}/mysql_${db}_$(_ts).sql"
mkdir -p "$BACKUP_DIR"
_log "Dumping MySQL database: $db"
mysqldump -u "$user" ${MYSQL_PASSWORD:+-p"$MYSQL_PASSWORD"} "$db" > "$dst"
if [[ "$COMPRESS" == "true" ]]; then
gzip "$dst"
dst="${dst}.gz"
fi
local size
size=$(du -sh "$dst" | cut -f1)
_log "Done: $dst ($size)"
_notify "✅ *MySQL backup complete*: \`$db\` → \`$dst\` ($size)"
}
cleanup_old() {
_log "Removing backups older than ${RETENTION_DAYS} days from $BACKUP_DIR"
find "$BACKUP_DIR" -type f -mtime +"$RETENTION_DAYS" -delete
_log "Cleanup done"
}
show_help() {
echo "backup.sh — automated backup utility"
echo ""
echo "Usage:"
echo " ./backup.sh dir <path> [name] Backup a directory"
echo " ./backup.sh postgres <dbname> Backup a PostgreSQL database"
echo " ./backup.sh mysql <dbname> Backup a MySQL/MariaDB database"
echo " ./backup.sh cleanup Remove backups older than RETENTION_DAYS"
echo ""
echo "Environment variables:"
echo " BACKUP_DIR Where to store backups (default: /var/backups/sysmon)"
echo " RETENTION_DAYS Days to keep backups (default: 7)"
echo " COMPRESS Enable gzip compression (default: true)"
echo " TELEGRAM_BOT_TOKEN Bot token for completion alerts"
echo " TELEGRAM_CHAT_ID Chat ID for completion alerts"
echo " PGUSER / PGPASSWORD PostgreSQL credentials"
echo " MYSQL_USER / MYSQL_PASSWORD MySQL credentials"
echo ""
echo "Examples:"
echo " ./backup.sh dir /var/www/html mysite"
echo " PGPASSWORD=secret ./backup.sh postgres mydb"
echo " BACKUP_DIR=/mnt/nas ./backup.sh cleanup"
echo " # Daily cron:"
echo " 0 3 * * * BACKUP_DIR=/backups /path/to/backup.sh dir /var/www/html"
}
case "${1:-help}" in
dir) backup_dir "${2:?Usage: backup.sh dir <path> [name]}" "${3:-}" ;;
postgres) backup_postgres "${2:?Usage: backup.sh postgres <dbname>}" ;;
mysql) backup_mysql "${2:?Usage: backup.sh mysql <dbname>}" ;;
cleanup) cleanup_old ;;
help|--help|-h) show_help ;;
*)
echo "Unknown command: $1" >&2
show_help
exit 1
;;
esac