Найти в Дзене

«Автоматические бэкапы в облако: скрипт на Bash + AWS S3».

Разберём создание скрипта для автоматического резервного копирования данных на AWS S3 с помощью Bash. bash aws s3 mb s3://my-server-backups bash # Для Ubuntu/Debian
sudo apt update && sudo apt install awscli
# Для CentOS/RHEL
sudo yum install awscli bash aws configure
# Введите: Access Key, Secret Key, регион (например, eu‑central‑1), формат вывода (json) bash #!/bin/bash
# === НАСТРОЙКИ ===
SOURCE_DIR="/var/www/html" # Директория для бэкапа
BACKUP_DIR="/opt/backups" # Локальная папка для временных архивов
BUCKET_NAME="my-server-backups" # Имя S3‑бакета
RETENTION_DAYS=7 # Дни хранения локальных копий
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_NAME="server_backup_$DATE.tar.gz"
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
LOG_FILE="/var/log/backup.log"
# === ФУНКЦИЯ ЛОГИРОВАНИЯ ===
log_message() {
echo "[$DATE] $1" >> "$LOG_FILE"
}
# === СОЗДАНИЕ ДИРЕКТОРИИ ДЛЯ БЭКАПОВ ===
mkdir -p "$BACKUP_DIR"
# === СОЗДАНИЕ АРХИВА ===
log_message "Начало созда
Оглавление

Разберём создание скрипта для автоматического резервного копирования данных на AWS S3 с помощью Bash.

Шаг 1. Подготовка AWS‑окружения

  1. Создайте S3‑бакет:

bash

aws s3 mb s3://my-server-backups

  1. Настройте IAM‑роль или пользователя:
    создайте IAM‑пользователя с политикой AmazonS3FullAccess;
    сохраните Access Key ID и Secret Access Key.
  2. Установите AWS CLI:

bash

# Для Ubuntu/Debian
sudo apt update && sudo apt install awscli

# Для CentOS/RHEL
sudo yum install awscli

  1. Настройте AWS CLI:

bash

aws configure
# Введите: Access Key, Secret Key, регион (например, eu‑central‑1), формат вывода (json)

Шаг 2. Создание скрипта бэкапа (backup-to-s3.sh)

bash

#!/bin/bash

# === НАСТРОЙКИ ===
SOURCE_DIR="/var/www/html" # Директория для бэкапа
BACKUP_DIR="/opt/backups" # Локальная папка для временных архивов
BUCKET_NAME="my-server-backups" # Имя S3‑бакета
RETENTION_DAYS=7 # Дни хранения локальных копий
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_NAME="server_backup_$DATE.tar.gz"
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
LOG_FILE="/var/log/backup.log"

# === ФУНКЦИЯ ЛОГИРОВАНИЯ ===
log_message() {
echo "[$DATE] $1" >> "$LOG_FILE"
}

# === СОЗДАНИЕ ДИРЕКТОРИИ ДЛЯ БЭКАПОВ ===
mkdir -p "$BACKUP_DIR"

# === СОЗДАНИЕ АРХИВА ===
log_message "Начало создания бэкапа: $BACKUP_NAME"
tar -czf "$BACKUP_PATH" -C "$SOURCE_DIR" . 2>/dev/null

if [ $? -eq 0 ]; then
log_message "Бэкап создан успешно: $BACKUP_PATH"
else
log_message "ОШИБКА: Не удалось создать бэкап"
exit 1
fi

# === ЗАГРУЗКА В S3 ===
log_message "Загрузка в S3: s3://$BUCKET_NAME/$BACKUP_NAME"
aws s3 cp "$BACKUP_PATH" "s3://$BUCKET_NAME/" --storage-class STANDARD

if [ $? -eq 0 ]; then
log_message "Бэкап загружен в S3 успешно"
else
log_message "ОШИБКА: Не удалось загрузить в S3"
exit 1
fi

# === ОЧИСТКА СТАРЫХ ЛОКАЛЬНЫХ КОПИЙ ===
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
log_message "Удалены локальные бэкапы старше $RETENTION_DAYS дней"

# === ОЧИСТКА СТАРЫХ КОПИЙ В S3 (опционально) ===
# Удаляем файлы старше 7 дней в S3 (требует настройки Lifecycle в консоли AWS)
# aws s3api put-bucket-lifecycle-configuration \
# --bucket $BUCKET_NAME \
# --lifecycle-configuration file://lifecycle.json

log_message "Бэкап завершён успешно"

Шаг 3. Настройка ротации бэкапов в S3

Вариант 1. Через Lifecycle в AWS Console:

  1. Перейдите в S3 → ваш бакет → ManagementCreate lifecycle rule.
  2. Настройте правило:
    Prefix: server_backup_ (если хотите фильтровать по имени);
    Transition: удалите после 7 дней;
    Action: Delete current versions.

Вариант 2. Через скрипт (добавьте в конец backup-to-s3.sh):

bash

# Удаляем старые бэкапы из S3 старше 7 дней
aws s3 ls "s3://$BUCKET_NAME/" --recursive | \
grep "server_backup_" | \
awk '{if($1 < "$(date -d '7 days ago' +%Y-%m-%d")") print $4}' | \
xargs -I {} aws s3 rm "s3://$BUCKET_NAME/{}"

Шаг 4. Настройка автоматического запуска через cron

  1. Откройте редактор cron:

bash

crontab -e

  1. Добавьте задание (например, ежедневно в 2:00):

bash

0 2 * * * /path/to/backup-to-s3.sh

  1. Для тестирования можно запустить раз в 2 минуты:

bash

*/2 * * * * /path/to/backup-to-s3.sh

Шаг 5. Проверка и тестирование

  1. Дайте скрипту права на выполнение:

bash

chmod +x /path/to/backup-to-s3.sh

  1. Запустите вручную:

bash

/path/to/backup-to-s3.sh

  1. Проверьте логи:

bash

tail -f /var/log/backup.log

  1. Убедитесь, что файл появился в S3:

bash

aws s3 ls s3://my-server-backups/

Дополнительные возможности

1. Бэкап базы данных PostgreSQL:
Добавьте перед созданием архива:

bash

PGPASSWORD="your_password" pg_dump -U username -h localhost dbname > /tmp/db_backup.sql
tar -czf "$BACKUP_PATH" -C /tmp db_backup.sql -C "$SOURCE_DIR" .

2. Бэкап MySQL:

bash

mysqldump -u root -pPASSWORD --all-databases > /tmp/mysql_backup.sql
tar -czf "$BACKUP_PATH" /tmp/mysql_backup.sql "$SOURCE_DIR"

3. Шифрование бэкапа:
Используйте gpg для шифрования перед загрузкой:

bash

gpg --symmetric --cipher-algo AES256 "$BACKUP_PATH"
aws s3 cp "$BACKUP_PATH.gpg" "s3://$BUCKET_NAME/"

4. Уведомления по email:
Добавьте в конец скрипта:

bash

if [ -f "$LOG_FILE" ]; then
mail -s "Backup Report" admin@example.com < "$LOG_FILE"
fi

Чек‑лист настройки

  1. [ ] Создан S3‑бакет.
  2. [ ] Настроен IAM‑пользователь с доступом к S3.
  3. [ ] Установлен и настроен AWS CLI.
  4. [ ] Скрипт бэкапа создан и протестирован вручную.
  5. [ ] Права на выполнение скрипта установлены (chmod +x).
  6. [ ] Cron‑задание добавлено и проверено.
  7. [ ] Логирование работает (/var/log/backup.log).
  8. [ ] Ротация бэкапов настроена (локально и в S3).
  9. [ ] Протестировано восстановление из бэкапа.
  10. [ ] Уведомления (email/Slack) настроены (опционально).

Заключение

Скрипт обеспечивает:

  • автоматическое создание сжатых архивов;
  • загрузку в AWS S3;
  • локальную и облачную ротацию бэкапов;
  • детальное логирование;
  • возможность расширения (бэкап БД, шифрование, уведомления).

Хотите, помогу адаптировать скрипт под ваш тип данных (например, для TFS‑сервера) или добавлю другие функции?