Имеем настроенный сервер 1с-предприятия.
В терминале ставим cifs-utils:
sudo apt install -y cifs-utils
Для выгрузки баз нам не нужно запускать 1с-клиента, что позволяет нам делать бэкап даже при отсутствии клиентских лицензий.
Также отсутствует необходимость получения монопольного доступа к базе данных, т.к. работаем напрямую с сервером PosgreSQL, хотя и инструментом от 1с.
Проверено на 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