Правильный подход к шифрованию БД, чтобы не оставлять персональные данные открытыми это: создать дамп → зашифровать его GPG → сохранить/отправить.
▪️ Подготовка GPG. На сервере, который будет создавать бэкапы, импортируйте публичный ключ:
gpg --import backup_public.key
Проверьте наличие ключа:
gpg --list-keys
Использовать будем шифрование public key → private key, так что дешифровать можно только на безопасном ПК/сервере.
🛠 Скрипт универсального бэкапа PostgreSQL/MySQL с шифрованием GPG
#!/usr/bin/env bash
set -euo pipefail
# === Настройки ===
BACKUP_DIR="/var/backups/db"
RETENTION_DAYS=7
GPG_RECIPIENT="backup@bashtex.com" # email из публичного ключа
TS=$(date +"%F_%H-%M-%S")
DB_TYPE="$1" # postgres | mysql
DB_NAME="$2" # имя базы
DB_USER="$3" # пользователь
mkdir -p "$BACKUP_DIR"
DUMP_FILE="$BACKUP_DIR/${DB_TYPE}_${DB_NAME}_${TS}.sql"
ENC_FILE="$DUMP_FILE.gpg"
LOG_FILE="$BACKUP_DIR/backup.log"
# === Логгер ===
log() {
echo "[$(date +%F_%T)] $*" | tee -a "$LOG_FILE"
}
log "=== Старт резервного копирования $DB_TYPE:$DB_NAME ==="
# === Дамп базы ===
case "$DB_TYPE" in
postgres)
log "Выполняю pg_dump…"
pg_dump -U "$DB_USER" "$DB_NAME" > "$DUMP_FILE"
;;
mysql)
log "Выполняю mysqldump…"
mysqldump -u "$DB_USER" "$DB_NAME" > "$DUMP_FILE"
;;
*)
log "Неизвестный тип БД: $DB_TYPE"
exit 1
;;
esac
log "Дамп создан: $DUMP_FILE"
# === Шифрование GPG ===
log "Шифрую дамп для получателя: $GPG_RECIPIENT"
gpg --yes --encrypt --recipient "$GPG_RECIPIENT" "$DUMP_FILE"
log "Шифрованный файл: $ENC_FILE"
# === Удаление оригинального дампа ===
rm -f "$DUMP_FILE"
log "Оригинальный файл удалён"
# === Очистка старых бэкапов ===
log "Удаление файлов старше $RETENTION_DAYS дней"
find "$BACKUP_DIR" -type f -name "*.gpg" -mtime "+$RETENTION_DAYS" -delete
log "Готово"
Скрипт:
делает бэкап PostgreSQL или MySQL;
шифрует его GPG-ключом;
сохраняет с датой;
удаляет старые копии.
логирует все происходящее
▪️ Запуск
PostgreSQL:
./backup.sh postgres mydb dbuser
MySQL/MariaDB:
./backup.sh mysql mydb root
▪️ Как восстановить?
gpg -d backup_postgres_mydb_2025-11-01_03-00-00.sql.gpg > restore.sql
PostgreSQL:
psql -U postgres mydb < restore.sql
MySQL:
mysql -u root mydb < restore.sql
BashTex 📱 #bash #utils