Сегодня я хочу поделиться простым, но очень полезным Bash-скриптом для автоматического резервного копирования директорий с ротацией старых бэкапов. Такой скрипт пригодится, если необходимо сохранять копии важных данных и при этом не засорять диск старыми архивами.
🔄 Скрипт: Backup с ротацией
📝 Пояснение к скрипту
1. Настройки переменных:
🔹
🔹
🔹
2. Скрипт проверяет, существует ли исходная директория. Если нет — выводит ошибку и завершает работу.
3. Создаётся папка назначения (
4. Делается tar.gz - архив директории, причём для удобства используется команда:
- Это позволяет не копировать весь путь в архив, а только нужную папку.
5. Если архивирование прошло успешно (код возврата 0) — выводим сообщение об успехе.
6. Далее команда
7. В конце скрипт выводит, сколько старых бэкапов удалено, и завершает работу.
📌 Как использовать
1. Скопируйте скрипт в файл, например:
2. Сделайте его исполняемым:
И добавить строку:
Здесь мы также перенаправляем вывод в лог-файл, чтобы отслеживать успешные и неуспешные запуски. 📜
📲 Мы в MAX
👉@bash_srv
🔄 Скрипт: Backup с ротацией
#!/usr/bin/env bash
# ================================
# Скрипт: backup_rotate.sh
# Автор: https://xn--r1a.website/bash_srv
# Описание: Создаёт архив указанной директории,
# хранит только последние N бэкапов, удаляя старые.
# ================================
# Настройки
SOURCE_DIR="/var/www/my_project" # Директория, которую резервируем
DEST_DIR="/backups/my_project" # Директория для хранения бэкапов
RETENTION_DAYS=7 # Сколько дней хранить бэкапы
# Текущее время для имени архива
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE_NAME="backup_${DATE}.tar.gz"
# Проверяем, что исходная директория существует
if [[ ! -d "$SOURCE_DIR" ]]; then
echo "❌ Исходная директория $SOURCE_DIR не найдена!"
exit 1
fi
# Создаём директорию назначения, если её нет
mkdir -p "$DEST_DIR"
# Создаём архив
tar -czf "${DEST_DIR}/${ARCHIVE_NAME}" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
if [[ $? -eq 0 ]]; then
echo "✅ Создан бэкап: ${DEST_DIR}/${ARCHIVE_NAME}"
else
echo "❌ Ошибка при создании архива!"
exit 1
fi
# Удаляем старые бэкапы старше RETENTION_DAYS
find "$DEST_DIR" -type f -name "backup_*.tar.gz" -mtime +${RETENTION_DAYS} -print -delete
echo "🗑️ Удалены бэкапы старше ${RETENTION_DAYS} дней."
exit 0
📝 Пояснение к скрипту
1. Настройки переменных:
🔹
SOURCE_DIR — путь к директории, которую нужно сохранить (например, веб-проект, база данных и т.д.).🔹
DEST_DIR — куда складываем архива (может быть локальная папка или смонтированный удалённый диск).🔹
RETENTION_DAYS — сколько дней хранить бэкапы. Всё, что старше этого значения, будет удаляться автоматически.2. Скрипт проверяет, существует ли исходная директория. Если нет — выводит ошибку и завершает работу.
3. Создаётся папка назначения (
mkdir -p), чтобы избежать ошибок, если её ещё нет.4. Делается tar.gz - архив директории, причём для удобства используется команда:
tar -czf ${DEST_DIR}/${ARCHIVE_NAME} -C $(dirname $SOURCE_DIR) $(basename $SOURCE_DIR)
- Это позволяет не копировать весь путь в архив, а только нужную папку.
5. Если архивирование прошло успешно (код возврата 0) — выводим сообщение об успехе.
6. Далее команда
find ищет файлы-архивы старше RETENTION_DAYS дней и удаляет их. Параметр -mtime +N означает “более N дней назад”. Опция -print -delete сначала покажет, что удаляется, а потом удалит.7. В конце скрипт выводит, сколько старых бэкапов удалено, и завершает работу.
📌 Как использовать
1. Скопируйте скрипт в файл, например:
sudo nano /usr/local/bin/backup_rotate.sh
2. Сделайте его исполняемым:
sudo chmod +x /usr/local/bin/backup_rotate.sh
3. Отредактируйте переменные в начале скрипта под свои нужды:
SOURCE_DIR="/path/to/your/data"
DEST_DIR="/path/to/backup/location"
RETENTION_DAYS=7
4. Запустите вручную, чтобы протестировать:
/usr/local/bin/backup_rotate.sh
5. Если всё работает как надо, добавьте задание в ``````bash
crontab``````bash
для автоматического запуска. Например, чтобы делать бэкап каждый день в 3:00:
sudo crontab -e
И добавить строку:
0 3 * * * /usr/local/bin/backup_rotate.sh >> /var/log/backup_rotate.log 2>&1
Здесь мы также перенаправляем вывод в лог-файл, чтобы отслеживать успешные и неуспешные запуски. 📜
📲 Мы в MAX
👉@bash_srv
👍10❤2
💡 Bash-совет: Анализ самых активных IP в логах веб-сервера 🐚🚀
Когда на сервере много трафика, полезно быстро узнать, какие IP-адреса обращаются к веб-серверу больше всего. Предлагаю скрипт, который:
1. Извлекает IP из access.log (или любого другого лог-файла).
2. Считает количество запросов от каждого IP.
3. Сортирует и показывает топ N «запросчиков».
📋 Скрипт:
📝 Как это работает
1. LOGFILE — путь к вашему файлу логов Nginx/Apache.
Для Apache обычно
Если у вас другой путь, просто адаптируйте переменную
2. Команда
Берёт первый столбец в каждой строке лога (IP-адрес).
Сохраняет все адреса во временный файл
3.
Второй
4.
Например:
5. По завершении удаляется временный файл
🔧 Как улучшить и кастомизировать
Датафильтрация: если нужен анализ только за последние N дней, можно применять
Здесь
Анализ URL: можно аналогично извлекать запрашиваемые URL:
Это покажет топ-10 запрашиваемых путей.
Выгрузка в файл/почту: чтобы сохранить результаты или отправить их администратору:
Интеграция в cron: автоматизируйте ежедневный отчёт:
Это запустит скрипт каждый день в 00:30 и добавит результаты в
🔔 Вывод: Используя этот простой Bash-скрипт, вы сможете в пару команд узнать, какие IP-адреса генерируют наибольшую нагрузку на ваш веб-сервер. Это поможет вовремя выявить подозрительные активности, защититься от DDoS-атак или просто понять, кто чаще всего посещает сайт.
📲 Мы в MAX
👉@bash_srv
Когда на сервере много трафика, полезно быстро узнать, какие IP-адреса обращаются к веб-серверу больше всего. Предлагаю скрипт, который:
1. Извлекает IP из access.log (или любого другого лог-файла).
2. Считает количество запросов от каждого IP.
3. Сортирует и показывает топ N «запросчиков».
📋 Скрипт:
top_ips.sh
#!/usr/bin/env bash
# --------------------------------------------
# Скрипт для поиска топ-N IP-адресов в логах
# Автор: @bash_srv
# --------------------------------------------
# Путь к лог-файлу (по умолчанию /var/log/nginx/access.log)
LOGFILE="/var/log/nginx/access.log"
# Сколько адресов показать (по умолчанию 10)
TOP_N=10
# Временный файл для списка всех IP
TEMP="/tmp/all_ips_$(date +%Y%m%d_%H%M%S).txt"
# Проверка, что лог-файл существует
if [[ ! -f "$LOGFILE" ]]; then
echo "❌ Лог-файл '$LOGFILE' не найден!"
exit 1
fi
echo "🔎 Извлекаем IP-адреса из $LOGFILE и рассчитываем топ $TOP_N..."
# 1. Извлекаем первый столбец (обычно там IP), записываем во временный файл
awk '{print $1}' "$LOGFILE" > "$TEMP"
# 2. Считаем повторы, сортируем по убыванию, выводим топ N
echo -e "\n📊 Топ $TOP_N IP-адресов (по количеству запросов):"
sort "$TEMP" | uniq -c | sort -nr | head -n "$TOP_N" | awk '{printf "%s запросов — %s\n", $1, $2}'
# 3. Убираем временный файл
rm -f "$TEMP"
echo -e "\n✅ Готово!"
📝 Как это работает
1. LOGFILE — путь к вашему файлу логов Nginx/Apache.
Для Apache обычно
/var/log/apache2/access.log, для Nginx — /var/log/nginx/access.log.Если у вас другой путь, просто адаптируйте переменную
LOGFILE.2. Команда
awk '{print $1}' "$LOGFILE":Берёт первый столбец в каждой строке лога (IP-адрес).
Сохраняет все адреса во временный файл
$TEMP.3.
sort "$TEMP" | uniq -c | sort -nr | head -n "$TOP_N":sort упорядочивает список IP по возрастанию.uniq -c объединяет подряд идущие одинаковые строки и выводит количество повторений.Второй
sort -nr сортирует по числу запросов (включая самое большое значение сверху).head -n "$TOP_N" берёт первые N строк (топ N IP).4.
awk '{printf "%s запросов — %s\n", $1, $2}' форматирует вывод:Например:
1234 запросов — 192.168.1.100.5. По завершении удаляется временный файл
$TEMP для чистоты.🔧 Как улучшить и кастомизировать
Датафильтрация: если нужен анализ только за последние N дней, можно применять
grep с date:
# Пример: IP-адреса из логов за сегодня
TODAY=$(date '+%d/%b/%Y')
grep "$TODAY" "$LOGFILE" | awk '{print $1}' > "$TEMP"
Здесь
date '+%d/%b/%Y' выдаёт, например, 05/Jun/2025, что совпадает со строками формата Nginx-лога.Анализ URL: можно аналогично извлекать запрашиваемые URL:
awk '{print $7}' "$LOGFILE" | sort | uniq -c | sort -nr | head -n 10
Это покажет топ-10 запрашиваемых путей.
Выгрузка в файл/почту: чтобы сохранить результаты или отправить их администратору:
OUTPUT="/tmp/top_ips_report.txt"
sort "$TEMP" | uniq -c | sort -nr | head -n "$TOP_N" > "$OUTPUT"
mail -s "Топ IP-адресов на $(hostname)" admin@example.com < "$OUTPUT"
Интеграция в cron: автоматизируйте ежедневный отчёт:
# crontab -e
30 0 * * * /usr/local/bin/top_ips.sh >> /var/log/top_ips.log
Это запустит скрипт каждый день в 00:30 и добавит результаты в
/var/log/top_ips.log.🔔 Вывод: Используя этот простой Bash-скрипт, вы сможете в пару команд узнать, какие IP-адреса генерируют наибольшую нагрузку на ваш веб-сервер. Это поможет вовремя выявить подозрительные активности, защититься от DDoS-атак или просто понять, кто чаще всего посещает сайт.
📲 Мы в MAX
👉@bash_srv
👍7