SHM Backup Script Generator
📚 Навигация по документации | ⚡ Quick Start |
Удобный и безопасный скрипт для автоматического создания резервных копий SHM (Server Hosting Manager) с отправкой в Telegram.
💻 Поддерживаемые ОС
Скрипт официально протестирован и поддерживается на:
Debian Family
- ✅ Debian 11 (Bullseye)
- ✅ Debian 12 (Bookworm)
- ✅ Debian 13 (Trixie)
- ✅ Ubuntu 20.04 LTS (Focal Fossa)
- ✅ Ubuntu 22.04 LTS (Jammy Jellyfish)
- ✅ Ubuntu 24.04 LTS (Noble Numbat)
RHEL Family
- ✅ CentOS 7, 8, 9
- ✅ RHEL 7, 8, 9
- ✅ AlmaLinux 8, 9
- ✅ Rocky Linux 8, 9
- ✅ Fedora (последние версии)
Требования
- Bash 4.0+
- Docker (для работы с контейнерами)
- curl (для отправки в Telegram)
- tar, grep, sed, split (стандартные утилиты)
💡 Скрипт может работать и на других Linux-дистрибутивах с bash и Docker, но официально не тестировался.
⚡ Автоматическая установка зависимостей
Новое в v2.1! Скрипт автоматически проверяет и устанавливает недостающие зависимости:
- 🔍 Проверка Docker - убеждается что Docker установлен (обязательно для SHM)
- 📦 Автоустановка утилит - автоматически устанавливает
curl,tar,grep,sed,split - ✅ Проверка версий - валидация Bash 4.0+
Что устанавливается автоматически:
- curl (для Telegram API)
- tar, grep, sed, split (системные утилиты)
Docker не устанавливается автоматически, так как он уже должен быть установлен для работы SHM.
При первом запуске скрипт проверит зависимости:
1✔ All dependencies satisfied
Или установит недостающие утилиты:
1✖ Missing required dependencies:
2 - curl
3
4Install missing packages automatically? (Y/n):
Просто нажмите Enter (или Y) и недостающие пакеты установятся автоматически! 🚀
🎯 Основные возможности
- ✅ Автоматическое резервное копирование MySQL базы данных
- ✅ Консистентный дамп БД (
--single-transactionдля InnoDB) - ✅ Резервное копирование Docker volume (WebDAV данные)
- ✅ Выборочное или полное копирование файлов
- ✅ Автоматическая отправка в Telegram
- ✅ Разделение больших архивов (>49MB)
- ✅ HTML-форматированные уведомления
- ✅ Детальная информация о резервной копии
- ✅ Lock-файл — защита от параллельного запуска
- ✅ Автоочистка — trap гарантирует удаление временных файлов
📋 Что включается в резервную копию
Всегда:
- 💾 MySQL база данных (
db_backup.sql) - 📦 Docker volume WebDAV (если существует)
Опционально:
- 📁 Вся папка SHM целиком, ИЛИ
- 📄 Только
docker-compose.ymlи.env
🚀 Быстрый старт
💡 Новичок? Воспользуйтесь ⚡ Quick Start Guide для пошаговой установки за 5 минут!
Установка
1bash <(wget -qO- https://dignezzz.github.io/shm/backup/backup.sh)
или
1bash backup.sh
Настройка (5 простых шагов)
1️⃣ Выберите путь к SHM
1📍 Specify the path to docker-compose.yml for SHM:
2 1) /root/shm
3 2) /opt/shm ← рекомендуемый
4 3) Enter manually
2️⃣ Выберите режим резервного копирования
1📁 Do you want to backup the entire folder?
2 1) Yes, backup all files and subfolders ← рекомендуется
3 2) No, backup only specific files
3️⃣ Конфигурация БД (автоматически из .env или вручную)
Скрипт автоматически прочитает настройки из .env файла, если он существует.
4️⃣ Настройте Telegram
1📡 Telegram Settings:
2 Bot Token: 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz (от @BotFather)
3 Chat ID: -1001234567890 (ID вашего чата/канала)
4 Topic ID: (опционально, для топиков)
5️⃣ Проверьте и подтвердите
1#### 5️⃣ Проверьте и подтвердите
2
3```text
4====================================================
5 Configuration Summary
6====================================================
7📁 SHM Path: /opt/shm
8📦 Backup Mode: Full folder
9🗄️ DB Container: shm-mysql-vsem
10💾 Database: shm (user: root)
11📱 Telegram Chat: -1001234567890
12
13Proceed? (Y/n):
6️⃣ Настройте автоматическое расписание
1====================================================
2 Automatic Backup Schedule Setup
3====================================================
4Would you like to set up automatic backups?
5
6 1) Every 1 hour
7 2) Every 2 hours
8 3) Every 3 hours
9 4) Every 4 hours
10 5) Every 6 hours
11 6) Every 12 hours
12 7) Once a day (at 03:00) ← рекомендуется
13 8) Twice a day (at 03:00 and 15:00)
14 9) Skip (configure manually later)
15
16Choose an option (1-9) [7]:
Рекомендации по частоте:
- Каждый час - для критичных данных, часто изменяющихся
- Каждые 2-4 часа - для активно используемых систем
- Каждые 6 часов - стандартный вариант (4 бэкапа в день)
- Раз в день - для стабильных систем с редкими изменениями
- Дважды в день - золотая середина для большинства случаев
1
2## 📱 Как выглядят сообщения в Telegram
3
4### Обычный бэкап
✅ SHM Backup Complete
🖥 Server: grizzly 📅 Date: 2025-11-06 14:30:15 UTC 📊 Archive: 23.5M
📦 Contents: 📁 Entire SHM folder 📋 db_backup.sql (MySQL) 💾 webdav-volume.tar.gz (shm-data)
💾 Database: shm (145.67 MB)
1
2### При разделении (>49MB)
✅ SHM Backup Complete
📦 Part: 2 of 3 (49M)
🖥 Server: grizzly 📅 Date: 2025-11-06 14:30:15 UTC 📊 Archive: 135M ...
1
2## ⏰ Автоматизация через Crontab
3
4### Вариант 1: Автоматическая настройка (рекомендуется)
5
6При установке скрипт предложит настроить автоматическое расписание. Просто выберите нужную частоту!
7
8**Преимущества:**
9- ✅ Настройка за 5 секунд
10- ✅ Автоматическая проверка существующих задач
11- ✅ Защита от дублирования
12- ✅ Готовые проверенные расписания
13
14### Вариант 2: Ручная настройка
15
16Если вы пропустили автоматическую настройку или хотите изменить расписание:
17
18```bash
19crontab -e
Добавьте одну из строк:
1# Каждый час
20 * * * * /opt/shm/backup.sh
3
4# Каждые 2 часа
50 */2 * * * /opt/shm/backup.sh
6
7# Каждые 3 часа
80 */3 * * * /opt/shm/backup.sh
9
10# Каждые 4 часа
110 */4 * * * /opt/shm/backup.sh
12
13# Каждые 6 часов (стандарт)
140 */6 * * * /opt/shm/backup.sh
15
16# Каждые 12 часов
170 */12 * * * /opt/shm/backup.sh
18
19# Раз в день в 3:00
200 3 * * * /opt/shm/backup.sh
21
22# Два раза в день (3:00 и 15:00)
230 3,15 * * * /opt/shm/backup.sh
24
25# Еженедельно по понедельникам в 02:30
2630 2 * * 1 /opt/shm/backup.sh
Полезные команды crontab
1# Просмотреть текущие задачи
2crontab -l
3
4# Редактировать задачи
5crontab -e
6
7# Удалить все задачи (осторожно!)
8crontab -r
9
10# Проверить логи выполнения (на большинстве систем)
11grep CRON /var/log/syslog
🛠 Ручной запуск
1/opt/shm/backup.sh
Вы увидите:
1Creating MySQL backup...
2✔ Database backup created successfully
3Detected WebDAV volume: shm-data
4✔ Volume shm-data backed up successfully
5Creating archive...
6Sending to Telegram...
7✔ Archive successfully sent
8✔ Backup completed successfully
🔒 Безопасность
- ✅ Пароли читаются из
.env, не хранятся в открытом виде - ✅ Временные файлы удаляются через
trap EXIT(даже при ошибке) - ✅ Lock-файл предотвращает параллельные запуски из cron
- ✅ Безопасная обработка пользовательского ввода (без
eval) - ✅ Строгая обработка ошибок (
set -euo pipefail) - ✅ Проверка HTTP-кода ответа Telegram API
- ✅ Рекомендуется ограничить права:
chmod 700 /opt/shm/backup.sh
📊 Что происходит при выполнении
- � Проверка lock-файла (защита от параллельных запусков)
- 📝 Создание дампа MySQL (
mysqldump --no-tablespaces --single-transaction) - 🔍 Автоопределение WebDAV volume из
docker-compose.yml - 📦 Резервное копирование volume через Alpine контейнер
- 🗜️ Создание tar.gz архива
- ✂️ Разделение на части по 49MB (если нужно)
- 📤 Отправка в Telegram с HTML-форматированием
- 🧹 Автоматическая очистка (через
trap EXIT)
❓ Часто задаваемые вопросы
Q: Как получить Telegram Bot Token?
A: Напишите @BotFather → /newbot → следуйте инструкциям
Q: Как узнать Chat ID?
A: Добавьте бота в чат → напишите что-то → откройте https://api.telegram.org/bot<TOKEN>/getUpdates
Q: Можно ли изменить настройки?
A: Да, перезапустите backup.sh или отредактируйте /opt/shm/backup.sh вручную
Q: Volume не определился автоматически?
A: Скрипт пропустит его с предупреждением. БД и файлы будут сохранены.
Q: Как восстановить из backup?
A:
1# Распаковать
2tar -xzf backup.tar.gz
3
4# Восстановить БД
5docker exec -i shm-mysql-vsem mysql -u root -p < db_backup.sql
6
7# Восстановить volume
8docker run --rm -v shm-data:/volume -v $(pwd):/backup alpine \
9 tar xzf /backup/webdav-volume.tar.gz -C /volume
🐛 Устранение проблем
Ошибка: "Failed to create database backup"
Проверьте:
- ✅ MySQL контейнер запущен:
docker ps | grep mysql - ✅ Правильные credentials в
.env - ✅ Имя контейнера корректно
Ошибка: "Telegram returned an error"
Проверьте:
- ✅ Токен бота правильный
- ✅ Chat ID в правильном формате (
-100для каналов) - ✅ Бот добавлен в чат/канал
- ✅ У бота есть права на отправку файлов
Volume не найден
- Проверьте:
docker volume ls | grep shm - Убедитесь что WebDAV сервис запущен
🎨 Особенности интерфейса
Интерактивная настройка:
- ✨ Цветной терминал
- 📋 Пронумерованные варианты
- ✅ Подтверждение перед созданием
- 📊 Резюме всех параметров
Telegram уведомления:
- 💪 Жирный текст для заголовков (HTML)
- 🔤 Моноширинный шрифт для данных
- 🎨 Эмодзи для быстрой навигации
- 📱 Удобно на мобильном
📝 Changelog
v2.2 (2026-03-02)
- 🔒 Lock-файл — защита от параллельного запуска бэкапов из cron
- 🧹 Trap cleanup — автоматическая очистка временных файлов при любом завершении (ошибка, Ctrl+C, успех)
- 💾
--single-transactionв mysqldump — консистентный бэкап InnoDB без блокировок таблиц - 🛡️ Устранена уязвимость — инъекция через
evalв обработке пользовательского ввода заменена на безопасныйprintf -v - 📡 Улучшена отправка в Telegram — проверка HTTP-кода ответа + exit-кода curl
- 🔧
splitдобавлен в проверку зависимостей - 📝 Вывод UI-сообщений через stderr (исправлено зависание при интерактивном вводе)
- 🐛 Исправлено чтение
.env— корректная обработка значений в кавычках
v2.1 (2025-11-06)
- ✨ Автоматическая проверка и установка утилит
- 🔍 Проверка наличия Docker (обязателен для SHM)
- 📦 Автоустановка curl, tar, grep, sed через apt/yum/dnf
- ✅ Проверка совместимости ОС перед установкой
- 💡 Упрощённая логика (Docker не устанавливается, так как уже есть в SHM)
v2.0 (2025-11-06)
- ✨ Полный рефакторинг
- 📱 HTML-форматирование в Telegram
- 📊 Статистика: продолжительность, количество файлов, таблиц БД
- 🎨 Интерактивное резюме
- 🔍 Автоопределение volume
- 🛡️ Улучшенная обработка ошибок
- ⏰ Автоматическая настройка crontab (9 вариантов расписания)
v1.0
- 🎉 Первый релиз
📄 Лицензия
MIT License
👨💻 Автор
Сделано с ❤️ для SHM Community
📝 Описание
SHM Backup создает резервные копии:
- Файлов конфигурации SHM (весь каталог или только ключевые файлы, такие как
docker-compose.ymlи.env). - Базы данных MySQL из Docker-контейнера.
После создания резервной копии скрипт:
- Архивирует данные.
- Отправляет архив в указанный Telegram-чат или канал.
- Если архив превышает лимит Telegram (50 МБ), разделяет его на части и отправляет последовательно.
💻 Установка
Для установки выполните команду:
1bash <(wget -qO- https://dignezzz.github.io/shm/backup/backup.sh)
Установщик загрузит скрипт и проведет через процесс настройки.
⚙️ Настройка
Во время установки вам нужно указать:
-
Путь к директории SHM:
/root/shm/opt/shm- Другой путь (ввод вручную)
-
Объем резервного копирования:
- Вся директория SHM
- Только ключевые файлы (
docker-compose.yml,.env)
-
Настройки базы данных:
- Автоматическое получение из файла
.env(если доступен). - Ручной ввод (если
.envне найден):- Имя пользователя MySQL
- Пароль MySQL
- Имя базы данных
- Имя Docker-контейнера с MySQL
- Автоматическое получение из файла
-
Настройки Telegram:
- Токен бота (получить у @BotFather)
- ID чата или канала (например,
-1001234567890) - ID темы (опционально)
🚀 Использование
После установки скрипт сохраняется в директории SHM как backup.sh. Для запуска выполните:
1bash /opt/shm/backup.sh
или
1bash /root/shm/backup.sh
(в зависимости от выбранного пути).
Действия скрипта:
- Проверяет lock-файл (защита от повторного запуска).
- Создает временную директорию в
/tmp. - Выполняет консистентный дамп БД (
mysqldump --single-transaction). - Копирует файлы согласно настройкам.
- Создает архив резервной копии.
- Отправляет архив в Telegram (с проверкой HTTP-кода ответа).
- Автоматически очищает временные файлы через
trap EXIT.
⏱️ Автоматизация
Для автоматического запуска по расписанию добавьте задачу в crontab:
1crontab -e
Примеры расписания:
1# Ежедневно в 03:00
20 3 * * * /opt/shm/backup.sh
3
4# Каждые 6 часов
50 */6 * * * /opt/shm/backup.sh
6
7# Каждый понедельник в 02:30
830 2 * * 1 /opt/shm/backup.sh
🔧 Устранение неполадок
Проблемы с базой данных
Если возникает ошибка:
1Error: Failed to create database backup
Проверьте:
- Корректность имени пользователя и пароля MySQL.
- Доступность Docker-контейнера MySQL.
- Права пользователя MySQL для
mysqldump.
Скрипт использует опцию --no-tablespaces, чтобы минимизировать требования к привилегиям.
Проблемы с Telegram
Если возникает ошибка:
1Error sending archive to Telegram
Проверьте:
- Корректность токена бота.
- Правильность ID чата/канала.
- Добавлен ли бот в чат/канал.
- Наличие у бота прав на отправку сообщений и файлов.
📌 Дополнительная информация
Структура архива
Архив содержит:
db_backup.sql— дамп базы данных MySQL.- Файлы конфигурации SHM (в зависимости от настроек).
Безопасность
- Временные файлы хранятся в
/tmpи удаляются черезtrap EXIT(даже при ошибке). - Lock-файл предотвращает параллельный запуск бэкапов.
- Пароли базы данных не сохраняются в истории команд.
- Рекомендуется ограничить доступ к скрипту:
1chmod 700 /opt/shm/backup.sh
Изменение настроек
Для изменения настроек:
- Отредактируйте
backup.shвручную. - Перезапустите установщик.
📜 Лицензия
MIT License