Разберём создание скрипта для автоматического резервного копирования данных на AWS S3 с помощью Bash.
Шаг 1. Подготовка AWS‑окружения
- Создайте S3‑бакет:
bash
aws s3 mb s3://my-server-backups
- Настройте IAM‑роль или пользователя:
создайте IAM‑пользователя с политикой AmazonS3FullAccess;
сохраните Access Key ID и Secret Access Key. - Установите AWS CLI:
bash
# Для Ubuntu/Debian
sudo apt update && sudo apt install awscli
# Для CentOS/RHEL
sudo yum install awscli
- Настройте 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:
- Перейдите в S3 → ваш бакет → Management → Create lifecycle rule.
- Настройте правило:
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
- Откройте редактор cron:
bash
crontab -e
- Добавьте задание (например, ежедневно в 2:00):
bash
0 2 * * * /path/to/backup-to-s3.sh
- Для тестирования можно запустить раз в 2 минуты:
bash
*/2 * * * * /path/to/backup-to-s3.sh
Шаг 5. Проверка и тестирование
- Дайте скрипту права на выполнение:
bash
chmod +x /path/to/backup-to-s3.sh
- Запустите вручную:
bash
/path/to/backup-to-s3.sh
- Проверьте логи:
bash
tail -f /var/log/backup.log
- Убедитесь, что файл появился в 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
Чек‑лист настройки
- [ ] Создан S3‑бакет.
- [ ] Настроен IAM‑пользователь с доступом к S3.
- [ ] Установлен и настроен AWS CLI.
- [ ] Скрипт бэкапа создан и протестирован вручную.
- [ ] Права на выполнение скрипта установлены (chmod +x).
- [ ] Cron‑задание добавлено и проверено.
- [ ] Логирование работает (/var/log/backup.log).
- [ ] Ротация бэкапов настроена (локально и в S3).
- [ ] Протестировано восстановление из бэкапа.
- [ ] Уведомления (email/Slack) настроены (опционально).
Заключение
Скрипт обеспечивает:
- автоматическое создание сжатых архивов;
- загрузку в AWS S3;
- локальную и облачную ротацию бэкапов;
- детальное логирование;
- возможность расширения (бэкап БД, шифрование, уведомления).
Хотите, помогу адаптировать скрипт под ваш тип данных (например, для TFS‑сервера) или добавлю другие функции?