Настройку провожу для почты на Яндексе, Debian 11.
Включаем в настройках Яндекса получение почты по imap и авторизацию по паролю приложений. Там же создаем пароль приложения.
Ставим ssmtp
apt update && apt upgrade -y && apt install ssmtp -y
Если при установке получаем ошибку
E: Sub-process /usr/bin/dpkg returned an error code (1)
Значит не соответствует имя в /etc/hostname указанному в /etc/hosts, исправляем
Настраиваем конфигурационный файл ssmtp.conf
nano /etc/ssmtp/ssmtp.conf
hostname=localhost
AuthUser=учётная_запись@yandex.ru
AuthPass=пароль_приложения_для_учётки_на_яндексе
smtp.yandex.ru:465
rewriteDomain=yandex.ru
UseTLS=YES
Настраиваем конфигурационный файл revaliases
nano /etc/ssmtp/revaliases
root:учётная_запись@yandex.ru:smtp.yandex.ru:465
Проверяем отправку электронной почты
echo -e "Subject: Тема письма" | ssmtp адрес@получателя
Имеем настроенный сервер 1с-предприятия.
В терминале ставим cifs-utils:
sudo apt install -y cifs-utils
Для выгрузки баз нам не нужно запускать 1с-клиента, что позволяет нам делать бэкап даже при отсутствии клиентских лицензий.
Также отсутствует необходимость получения монопольного доступа к базе данных, т.к. работаем напрямую с сервером PosgreSQL, хотя и инструментом от 1с.
Проверено на 1с версии 8.3.14 и выше.
Я скрипт кладу по следующему пути: /home/grif/dts/
Также используется папка /home/grif/dts/mail/, поменяйте на нужное.
Создаем файлик /home/grif/dts/backupdts.sh следующего содержания:
touch backup1c.sh && nano backup1c.sh
#!/bin/bash
# Путь к виндовой шаре
SHAREPATH="//1c-backup-dot/1c"
#Дополнительный путь внутри шары если присутствует, или "" при отсутствии (обращаем внимание на слэш в конце пути)
ADDSHAREPATH="backups/"
# Точка монтирования
LOCAL_MOUNT_PATH="/mnt/BackUps"
# Домен шары
DOMAIN="1c-backup-dot"
# Пользователь шары
USER="user_RW"
# Пароль шары
PASSWORD="ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_ШАРЫ"
# Логин пользователя СУБД
POSTGRES_ADMIN="postgres"
# Пароль пользователя СУБД
POSTGRES_ADMIN_PASSWORD="ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_POSTGRES"
# Имя пользователя БД
INFOBASE_USER="ПОЛЬЗОВАТЕЛЬ_1с"
# Пароль пользователя БД
INFOBASE_USER_PASSWORD="ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_1с"
# DNS имя сервера PostgreSQL или IP-адрес оного
POSTGRES_SERVER_NAME="1c-sql"
# Получаем текущую дату
NOW=$(date +"-"%d"."%m"."%Y"-"%H"."%M)
# Задаем количество дней ротации резервных копий БД
ROTATE=14
# Переменная ошибок при резервном копировании
ERROR_FOUND=0
# Через пробел в кавычках заполняем массив значениями БД на сервере
allBases=("1c-buh" "1c-zup")
# Монтируем Windows-шару (при отсутствии домена не указываем параметр dom=$DOMAIN)
sudo mount -t cifs $SHAREPATH $LOCAL_MOUNT_PATH -o dom=$DOMAIN,user=$USER,pass=$PASSWORD,iocharset=utf8,file_mode=0777,dir_mode=0777
echo "====Отчёт====" > /home/grif/dts/mail/body
# для каждого значения массива
for t in ${allBases[@]};
do
# выгружаем БД
/opt/1cv8/x86_64/8.3.21.1622/ibcmd infobase dump --dbms=PostgreSQL --db-server=$POSTGRES_SERVER_NAME --db-user=$POSTGRES_ADMIN --db-pwd=$POSTGRES_ADMIN_PASSWORD --db-name=$t $t$NOW.dt --user=$INFOBASE_USER --password=$INFOBASE_USER_PASSWORD
# проверка на ошибки при выгрузке
if [ $? -eq 0 ]; then
echo $t "- Ok" >> /home/grif/dts/mail/body
else
echo $t " - ERROR!!!" >> /home/grif/dts/mail/body
ERROR_FOUND=1
fi
# Создаем папку с именем БД в случае ее отсутствия, в ней будут лежать бэкапы базы по датам
if [ ! -d "$LOCAL_MOUNT_PATH/$ADDSHAREPATH$t" ]; then
mkdir -p $LOCAL_MOUNT_PATH/$ADDSHAREPATH$t
fi
# переносим в папку с бэкапами
mv $t$NOW.dt $LOCAL_MOUNT_PATH/$ADDSHAREPATH$t
# Удаляем бэкапы старше $ROTATE
find $LOCAL_MOUNT_PATH/$ADDSHAREPATH$t -type f -mtime +$ROTATE -print0 | xargs -0 rm -f
done
# Размонтируем шару
sudo umount $LOCAL_MOUNT_PATH
# Удаляем ошибочные копии, оставшиеся при выключении света, например
sudo rm -rf /root/*.dt
sudo rm -rf /home/grif/backup/*.dt
# Готовим письмо
echo To: учётная_запись@yandex.ru > /home/grif/dts/mail/headers
echo From: учётная_запись@yandex.ru >> /home/grif/dts/mail/headers
# Проверка на ошибки во время резервного копирования
if [ $ERROR_FOUND -eq "1" ]; then
echo Subject: 1c Organization_NAME - ERRORS!!! >> /home/grif/dts/mail/headers
else
echo Subject: 1с Organization_NAME >> /home/grif/dts/mail/headers
fi
# Добавляем одну пустую строку, чтобы ssmtp понял где начинается тело письма
echo -e "" >> /home/grif/dts/mail/headers
# Добавляем лог выгрузки
cat /home/grif/dts/mail/body >> /home/grif/dts/mail/headers
# Отправляем письмо
ssmtp -t < /home/grif/dts/mail/headers
Осталось лишь добавить права на выполнение скрипта (chmod +x backup1c.sh в папке со скриптом) и добавить задание в крон с необходимой периодичностью.
Добавляем задание:
nano /etc/crontab
В конце файла вставляем строку
00 22 * * * root /home/grif/dts/backup1c.sh
Т.е. я указал, что в 22:00 из папки /home/grif/dts/ будет выполнен скрипт backupdts.sh от имени пользователя root