Бэкап 1с-баз в *.dt (cifs)

Предварительная настройка ssmtp

Настройку провожу для почты на Яндексе, 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с версии 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


Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.