Bash-скрипт для резервного копирования данных CommuniGate Pro на Linux-сервере.
Скрипт создаёт ежедневные архивы локально, при необходимости создаёт месячную копию, дополнительно переносит архивы в указанное хранилище и отправляет email-отчёт.
-
Создаёт локальные архивы в:
/backups/CommuniGate/Day/YYYY-MM-DD -
Первого числа месяца или при запуске с ключом
--monthlyсоздаёт месячную копию в:/backups/CommuniGate/Monthly/YYYY-MM-DD -
Дополнительно копирует архивы в удалённое или внешнее хранилище, указанное в переменной:
REMOTE_BACKUP_ROOT="/mnt/communigate_backup" -
Отправляет HTML-отчёт на email через локальный SMTP:
SMTP_SERVER="smtp://127.0.0.1:25"
SMTP-авторизация в скрипте не используется. Скрипт рассчитан на запуск локально на сервере, где работает CommuniGate Pro, Postfix, Exim или другой локальный SMTP-сервис.
- Архивация основных аккаунтов из
Accounts. - Архивация доменных аккаунтов из
Domains. - Архивация системных папок:
SettingsDirectorySystemLogsSubmitted
- Ежедневные локальные архивы.
- Месячные архивы первого числа месяца.
- Принудительное создание месячной копии через
--monthly. - Дополнительное копирование в любое доступное хранилище:
- NFS
- Samba/CIFS
- rclone mount
- sshfs
- внешний диск
- обычная локальная папка
- Проверка свободного места локально и в дополнительном хранилище.
- Проверка marker-файла, чтобы не писать архивы не туда.
- Защита от параллельного запуска через
flock. - Поддержка
dry-run. - Email-отчёт через локальный SMTP без логина и пароля.
- Ротация локальных и remote-копий.
- Логирование всех важных операций.
Рекомендуется:
Debian 12
Ubuntu Server 22.04/24.04
Скрипт должен запускаться от root.
Нужные пакеты:
apt update
apt install -y pigz curl rsync tar bc util-linuxИспользуемые команды:
bash
pigz
curl
rsync
tar
bc
flock
mountpoint
df
awk
find
sort
xargs
mktemp
sed
stat
basename
chmod
mkdir
rm
mv
tee
Скопируйте скрипт на сервер:
install -m 700 communigate-backup.sh /usr/local/sbin/communigate-backup.shИли вручную:
cp communigate-backup.sh /usr/local/sbin/communigate-backup.sh
chmod 700 /usr/local/sbin/communigate-backup.shПроверка синтаксиса:
bash -n /usr/local/sbin/communigate-backup.shПроверка ShellCheck:
shellcheck /usr/local/sbin/communigate-backup.shНастройки находятся в верхней части скрипта.
BASE_DIR="/var/CommuniGate"
DIR_ACCOUNTS="$BASE_DIR/Accounts"
DOMAINS_DIR="$BASE_DIR/Domains"Обычно для Debian это:
/var/CommuniGate
LOCAL_BACKUP_ROOT="/backups/CommuniGate"
LOCAL_DAY_BASE="$LOCAL_BACKUP_ROOT/Day"
LOCAL_MONTHLY_BASE="$LOCAL_BACKUP_ROOT/Monthly"
LOG_DIR="$LOCAL_BACKUP_ROOT/Logs"Итоговая структура:
/backups/CommuniGate/
├── Day/
│ └── YYYY-MM-DD/
├── Monthly/
│ └── YYYY-MM-DD/
└── Logs/
Скрипт не знает и не должен знать, чем является дополнительное хранилище. Это может быть NFS, Samba/CIFS, rclone mount, sshfs, внешний диск или обычная локальная папка.
Главная переменная:
REMOTE_BACKUP_ROOT="/mnt/communigate_backup"Структура внутри дополнительного хранилища:
/mnt/communigate_backup/
└── CommuniGate/
├── Day/
├── Monthly/
└── Logs/
По умолчанию рекомендуется требовать, чтобы REMOTE_BACKUP_ROOT был точкой монтирования:
REMOTE_REQUIRE_MOUNTPOINT=trueЭто защищает от ситуации, когда NFS/Samba/rclone не смонтировались, а скрипт начал писать архивы в пустую локальную папку /mnt/....
Если вы используете обычную локальную папку, укажите:
REMOTE_REQUIRE_MOUNTPOINT=falseMarker-файл защищает от записи не в то хранилище:
REMOTE_REQUIRE_MARKER=true
REMOTE_MARKER_FILE="$REMOTE_BACKUP_ROOT/backup_marker_do_not_delete"Создать marker-файл:
touch /mnt/communigate_backup/backup_marker_do_not_deleteЕсли marker-файл не нужен:
REMOTE_REQUIRE_MARKER=falseLOCAL_DAILY_RETENTION_DAYS=4
REMOTE_DAILY_RETENTION_DAYS=14
MONTHLY_RETENTION=3
LOG_RETENTION_COUNT=16Значения означают:
LOCAL_DAILY_RETENTION_DAYS— сколько дней хранить локальные дневные копии.REMOTE_DAILY_RETENTION_DAYS— сколько дней хранить дневные копии в дополнительном хранилище.MONTHLY_RETENTION— сколько последних месячных наборов хранить.LOG_RETENTION_COUNT— сколько последних логов хранить.
REQUIRED_SPACE_LOCAL=2000
REQUIRED_SPACE_REMOTE=5000Значения указаны в мегабайтах.
Если свободного места локально меньше REQUIRED_SPACE_LOCAL, скрипт завершится с ошибкой.
Если свободного места в дополнительном хранилище меньше REQUIRED_SPACE_REMOTE, скрипт продолжит работу, но итоговый статус будет CRITICAL.
Скрипт отправляет письмо через локальный SMTP без авторизации:
MAIN_DOMAIN="example.com"
EMAIL_TO="admin@example.com"
EMAIL_FROM="backup@example.com"
SMTP_SERVER="smtp://127.0.0.1:25"В скрипте специально нет:
EMAIL_LOGIN
EMAIL_PASS
--userПроверка локальной отправки вручную:
cat > /tmp/test-backup-mail.txt <<'MAIL'
From: <backup@example.com>
To: <admin@example.com>
Subject: Test backup mail
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Тест отправки через локальный SMTP без авторизации.
MAIL
curl -v \
--url smtp://127.0.0.1:25 \
--mail-from backup@example.com \
--mail-rcpt admin@example.com \
--upload-file /tmp/test-backup-mail.txt/usr/local/sbin/communigate-backup.sh/usr/local/sbin/communigate-backup.sh --dry-run --no-email/usr/local/sbin/communigate-backup.sh --monthly/usr/local/sbin/communigate-backup.sh --no-email/usr/local/sbin/communigate-backup.sh --helpОткройте системный cron:
mcedit /etc/crontabПример ежедневного запуска в 02:30:
30 2 * * * root /usr/local/sbin/communigate-backup.shУстановка клиента:
apt update
apt install -y nfs-commonСоздание точки монтирования:
mkdir -p /mnt/communigate_backupПример строки /etc/fstab:
192.168.1.10:/backup/communigate /mnt/communigate_backup nfs defaults,_netdev,nofail 0 0
Монтирование:
mount /mnt/communigate_backup
touch /mnt/communigate_backup/backup_marker_do_not_deleteНастройки в скрипте:
REMOTE_BACKUP_ROOT="/mnt/communigate_backup"
REMOTE_REQUIRE_MOUNTPOINT=true
REMOTE_REQUIRE_MARKER=trueУстановка клиента:
apt update
apt install -y cifs-utilsФайл учётных данных:
mcedit /root/.smb-communigate-backupПример:
username=backup_user
password=backup_password
domain=WORKGROUPПрава:
chmod 600 /root/.smb-communigate-backupСоздание точки монтирования:
mkdir -p /mnt/communigate_backupПример строки /etc/fstab:
//192.168.1.10/backup /mnt/communigate_backup cifs credentials=/root/.smb-communigate-backup,iocharset=utf8,vers=3.0,_netdev,nofail 0 0
Монтирование:
mount /mnt/communigate_backup
touch /mnt/communigate_backup/backup_marker_do_not_deleteНастройки в скрипте:
REMOTE_BACKUP_ROOT="/mnt/communigate_backup"
REMOTE_REQUIRE_MOUNTPOINT=true
REMOTE_REQUIRE_MARKER=trueСкрипт бэкапа не запускает rclone mount самостоятельно. Настройте rclone mount отдельно, например через systemd.
Итоговая точка должна быть доступна как обычный каталог:
/mnt/communigate_backup
Проверка:
mountpoint /mnt/communigate_backup
touch /mnt/communigate_backup/backup_marker_do_not_deleteНастройки в скрипте:
REMOTE_BACKUP_ROOT="/mnt/communigate_backup"
REMOTE_REQUIRE_MOUNTPOINT=true
REMOTE_REQUIRE_MARKER=true/backups/CommuniGate/
├── Day/
│ └── YYYY-MM-DD/
│ ├── accounts/
│ ├── domains/
│ └── system/
├── Monthly/
│ └── YYYY-MM-DD/
└── Logs/
/mnt/communigate_backup/
└── CommuniGate/
├── Day/
│ └── YYYY-MM-DD/
├── Monthly/
│ └── YYYY-MM-DD/
└── Logs/
Логи хранятся локально:
/backups/CommuniGate/Logs/
Также текущий лог копируется в дополнительное хранилище:
/mnt/communigate_backup/CommuniGate/Logs/
Посмотреть последний лог:
ls -1t /backups/CommuniGate/Logs/backup_*.log | head -n 1Пример просмотра:
tail -n 100 /backups/CommuniGate/Logs/backup_YYYY-MM-DD-HHMMSS.logПроверьте:
mountpoint /mnt/communigate_backup
ls -la /mnt/communigate_backup
ls -la /mnt/communigate_backup/backup_marker_do_not_deleteЕсли это обычная локальная папка, установите:
REMOTE_REQUIRE_MOUNTPOINT=falseСоздайте marker-файл:
touch /mnt/communigate_backup/backup_marker_do_not_deleteПроверьте локальную отправку:
curl -v \
--url smtp://127.0.0.1:25 \
--mail-from backup@example.com \
--mail-rcpt admin@example.com \
--upload-file /tmp/test-backup-mail.txtПроверьте очередь и логи вашего почтового сервера.
Проверьте:
df -h /backups/CommuniGate
df -h /mnt/communigate_backupИзмените лимиты:
REQUIRED_SPACE_LOCAL=2000
REQUIRED_SPACE_REMOTE=5000Проверьте дату сервера:
dateПринудительно проверьте monthly-режим:
/usr/local/sbin/communigate-backup.sh --monthly --no-emailПеред публикацией проверьте, что в скрипте нет реальных доменов, email-адресов, паролей и внутренних IP:
grep -nE 'stpserver|clubideal|alexs|statmon|EMAIL_PASS|EMAIL_LOGIN|--user|[0-9]{1,3}(\.[0-9]{1,3}){3}' communigate-backup.shВ публичной версии используйте:
MAIN_DOMAIN="example.com"
EMAIL_TO="admin@example.com"
EMAIL_FROM="backup@example.com"
REMOTE_BACKUP_ROOT="/mnt/communigate_backup"Не публикуйте:
rclone.conf
*.log
*.tar.gz
*.conf с реальными доступами
ключи
пароли
# Реальные конфиги и секреты
*.conf
.env
rclone.conf
*.key
*.pem
id_rsa
id_ed25519
# Логи
*.log
logs/
Logs/
# Архивы и бэкапы
*.tar
*.tar.gz
*.tgz
*.zip
*.7z
*.bak
backups/
# Временные файлы
*.tmp
*.swp
*~Проект распространяется под лицензией MIT.
Скрипт:
chmod 700 /usr/local/sbin/communigate-backup.shЕсли используется отдельный конфиг с реальными настройками:
chmod 600 /etc/communigate-backup.conf