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

Имеем настроенный сервер 1с-предприятия.
В терминале ставим cifs-utils:

sudo apt install -y cifs-utils

Для выгрузки баз нам не нужно запускать 1с-клиента, что позволяет нам делать бэкап даже при отсутствии клиентских лицензий.
Также отсутствует необходимость получения монопольного доступа к базе данных, т.к. работаем напрямую с сервером PosgreSQL, хотя и инструментом от .
Проверено на 1с версии 8.3.14 и выше.

Создаем файлик 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
# Через пробел в кавычках заполняем массив значениями БД на сервере
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

# для каждого значения массива
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 [ ! -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

# Отправляем письмо на мыло
echo Date: $NOW > /home/grif/dts/headers
echo From: 1c-backupper@a............t.ru >> /home/grif/dts/headers
echo To: it@astmorport.ru >> /home/grif/dts/headers
echo Subject: 1с Vitamed $NOW >> /home/grif/dts/headers
echo Content: Выгрузка завершена >> /home/grif/dts/headers
ssmtp it@a............t.ru < /home/grif/dts/headers

Осталось лишь внести изменения в описанные переменные, положить файлик куда вам будет удобно, добавить права на выполнение скрипта (chmod +x backup1c.sh в папке со скриптом) и добавить задание в крон с необходимой периодичностью.
Добавляем задание:

# vi /etc/crontab

В конце файла вставляем строку

00 22   * * *    root   /home/dts/backup1c.sh

Т.е. я указал, что в 22:00 из папки /home/dts/ будет выполнен скрипт backupdts.sh от имени пользователя root


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