1c: различия между версиями
Vovan (обсуждение | вклад) (→Базовый скрипт) |
Vovan (обсуждение | вклад) (→Скрипт для резервирования конкретной базы данных) |
||
Строка 122: | Строка 122: | ||
===Скрипт для резервирования конкретной базы данных=== | ===Скрипт для резервирования конкретной базы данных=== | ||
+ | Данный скрипт представляет из себя обёртку над выше приведённым скриптом, с заданием конкретных параметров резервирования | ||
+ | |||
+ | <pre> | ||
+ | cat << 'EOF' > /opt/1c_backup_scripts/backup__my_super_infobase.sh | ||
+ | #!/bin/bash | ||
+ | |||
+ | ### PARAMETERS ### | ||
+ | STORAGE="/mnt/storage/my-1c-host-backups" # каталог для сохранения резервных копий | ||
+ | SRV="my-1c-host" # хост, на котором работает платформа "1С: Предприятие" | ||
+ | REF="my_super_infobase" # имя базы данных, которую резервируем | ||
+ | LOGIN="backupuser" # 1с-пользователь, которому разрешено резервировать базу данных | ||
+ | PASSWORD_FILE="/home/administrator/.1c-cluster-infobases-backup.pass" # в этом файле должен находиться только пароль от 1с-пользоателя | ||
+ | KEEP_BACKUPS_FOR_LAST_DAYS="2" # сохранить резервные копии только за эти несколько последных дней (в текущем примере - за 2 последних дня) | ||
+ | BACKUP_TIMEOUT_SEC="300" # таймаут, в течение которого разрешено работать процессу резервирования (процессу платформы "1С: Предприятие". Если за этот таймаут процесс не успел сделать резервную копию, то он снимается с выполнения) | ||
+ | |||
+ | # ------------------------------------------------------------------------------------------------ | ||
+ | |||
+ | ### BOT PARAMETERS | ||
+ | TELEGRAM_BOT_TOKEN="" # сюда нужно вписать токен телеграм-бота, который будет отсылать уведомления | ||
+ | TELEGRAM_DESTINATION_GROUP_ID="" # сюда нужно вписать идентификатор телеграм-пользователя или телеграм-группы (не забывайте про минус в начале, если это идентификатор группы), в которого (или в которую, если это группа) бот будет писать сообщения | ||
+ | |||
+ | function send_message_telegram(){ | ||
+ | #exit 0 # раскомментируйте эту строчку, если отсылка сообщений телеграм-ботом не нужна (следовательно, и параметры дя бота при этом можно не задавать) | ||
+ | message=${1} | ||
+ | curl -s -X POST \ | ||
+ | -H 'Content-Type: application/json' \ | ||
+ | -d "{\"chat_id\": \"${TELEGRAM_DESTINATION_GROUP_ID}\", \"text\": \"${message}\", \"disable_notification\": true}" \ | ||
+ | https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage > /dev/null | ||
+ | } | ||
+ | # ------------------------------------------------------------------------------------------------ | ||
+ | |||
+ | ### START ### | ||
+ | BASE=`dirname ${0}` | ||
+ | ${BASE}/backup_infobase_1c_generic.sh "${STORAGE}" "${SRV}" "${REF}" "${LOGIN}" "${PASSWORD_FILE}" "${KEEP_BACKUPS_FOR_LAST_DAYS}" "${BACKUP_TIMEOUT_SEC}" | ||
+ | res=$? | ||
+ | |||
+ | if [ ${res} -eq 0 ]; then | ||
+ | send_message_telegram "[Успешно]\nРезервное копирование информационной базы '${REF}' выполнено успешно" | ||
+ | else | ||
+ | send_message_telegram "[Ошибка]\nРезервное копирование информационной базы '${REF}' не выполнено" | ||
+ | fi | ||
+ | EOF | ||
+ | </pre> | ||
+ | |||
+ | Делаем файл исполняемым | ||
+ | |||
+ | chmod +x /opt/1c_backup_scripts/backup__my_super_infobase.sh |
Версия 11:58, 25 декабря 2023
Содержание
В GNU/Linux
Автоматизация резервного копирования информационных баз
Предполагается, что платформа "1С Предприятие" работает на GNU/Linux системе и скрипт резервного копирования выполняется от пользователя
administrator
, графическое окружение которого автоматически запускается после загрузки компьютера.
Дело в том, что по каким-то причинам, разработчики платформы "1С Предприятие" не заложили в систему запуск резервного копирования в headless-режиме, поэтому платформе необходим дисплей X-сервера.
Также предполагается, что файл с паролем от пользователя платформы "1С Предприятие", которому разрешено выполнять резервное копирование, хранится в файле
/home/administrator/.1c-cluster-infobases-backup.pass
и рекомендуемые права на этот файл
0400
Подготовка каталога для скриптов
mkdir /opt/1c_backup_scripts
Базовый скрипт
При необходимости, в тексте скрипта, отредактируйте строчку
bin1c="/opt/1cv8/x86_64/8.3.23.1912/1cv8"
, указав путь до конкретной версии платформы "1С Предприятие".
Ниже предоставлен текст, который можно выделить, скопировать в текстовый редактор, при необходимости поправить, затем весь этот текст можно бросить в консоль для создания файла посредством heredoc-синтаксиса:
cat << 'EOF' > /opt/1c_backup_scripts/backup_infobase_1c_generic.sh #!/bin/bash export LANG=ru_RU.UTF-8 NON_ROOT_USER="administrator" DISPLAY=":0" STORAGE="${1}" SRV="${2}" REF="${3}" LOGIN="${4}" PASSWORD_FILE="${5}" KEEP_BACKUPS_FOR_LAST_DAYS="${6}" BACKUP_TIMEOUT_SEC="${7}" TIMEOUT_COUNTER=0 #----------------------------- export DISPLAY="${DISPLAY}" bin1c="/opt/1cv8/x86_64/8.3.23.1912/1cv8" PASSWORD=`cat ${PASSWORD_FILE} | head -1` infobase_suffix="$(date +%Y-%m-%d-%H-%M-%S).dt" ib_filepath="${STORAGE}/${REF}__${infobase_suffix}" ib_log="${ib_filepath}.log" function rotate_backups(){ filenames_cmd="${STORAGE}/${REF}*" current_unixtime=`date +%s --date="$(date +%Y-%m-%d) 00:00:00"` test_unixtime=$(($current_unixtime-$KEEP_BACKUPS_FOR_LAST_DAYS*60*60*24)) for f in $(/bin/ls $filenames_cmd); do datetime_from_file=`echo ${f} | awk -F '__' {'print $2'} | awk -F '.' {'print $1'}` Y=`echo ${datetime_from_file} | awk -F '-' {'print $1'}` M=`echo ${datetime_from_file} | awk -F '-' {'print $2'}` D=`echo ${datetime_from_file} | awk -F '-' {'print $3'}` h=`echo ${datetime_from_file} | awk -F '-' {'print $4'}` m=`echo ${datetime_from_file} | awk -F '-' {'print $5'}` s=`echo ${datetime_from_file} | awk -F '-' {'print $6'}` unixtime_from_file=`date +%s --date="${Y}-${M}-${D} ${h}:${m}:${s}"` if [[ $unixtime_from_file -lt $test_unixtime ]]; then echo "delete file: ${f}" /bin/rm ${f} else echo "keep file: ${f}" fi done } function wait(){ if [[ $TIMEOUT_COUNTER -ge $BACKUP_TIMEOUT_SEC ]]; then kill -9 ${1} fi if [ ! -d /proc/${1}/ ]; then nice_text="Выгрузка информационной базы успешно завершена" res_text=$(grep -o -i "${nice_text}" ${ib_log}) # start apache2 sudo systemctl start httpd2 if [ "${res_text}" = "${nice_text}" ]; then rotate_backups exit 0 fi exit 1 fi sleep 1 TIMEOUT_COUNTER=$(($TIMEOUT_COUNTER+1)) wait ${1} } # stop apache2 sudo systemctl stop httpd2 sleep 2 DISPLAY=:0 XAUTHORITY=/home/administrator/.Xauthority ${bin1c} CONFIG /N "${LOGIN}" /P "${PASSWORD}" /S "${SRV}/${REF}" /DumpIB "${ib_filepath}" /OUT "${ib_log}" & main_process_pid=$! wait ${main_process_pid} EOF
Делаем файл исполняемым
chmod +x /opt/1c_backup_scripts/backup_infobase_1c_generic.sh
Скрипт для резервирования конкретной базы данных
Данный скрипт представляет из себя обёртку над выше приведённым скриптом, с заданием конкретных параметров резервирования
cat << 'EOF' > /opt/1c_backup_scripts/backup__my_super_infobase.sh #!/bin/bash ### PARAMETERS ### STORAGE="/mnt/storage/my-1c-host-backups" # каталог для сохранения резервных копий SRV="my-1c-host" # хост, на котором работает платформа "1С: Предприятие" REF="my_super_infobase" # имя базы данных, которую резервируем LOGIN="backupuser" # 1с-пользователь, которому разрешено резервировать базу данных PASSWORD_FILE="/home/administrator/.1c-cluster-infobases-backup.pass" # в этом файле должен находиться только пароль от 1с-пользоателя KEEP_BACKUPS_FOR_LAST_DAYS="2" # сохранить резервные копии только за эти несколько последных дней (в текущем примере - за 2 последних дня) BACKUP_TIMEOUT_SEC="300" # таймаут, в течение которого разрешено работать процессу резервирования (процессу платформы "1С: Предприятие". Если за этот таймаут процесс не успел сделать резервную копию, то он снимается с выполнения) # ------------------------------------------------------------------------------------------------ ### BOT PARAMETERS TELEGRAM_BOT_TOKEN="" # сюда нужно вписать токен телеграм-бота, который будет отсылать уведомления TELEGRAM_DESTINATION_GROUP_ID="" # сюда нужно вписать идентификатор телеграм-пользователя или телеграм-группы (не забывайте про минус в начале, если это идентификатор группы), в которого (или в которую, если это группа) бот будет писать сообщения function send_message_telegram(){ #exit 0 # раскомментируйте эту строчку, если отсылка сообщений телеграм-ботом не нужна (следовательно, и параметры дя бота при этом можно не задавать) message=${1} curl -s -X POST \ -H 'Content-Type: application/json' \ -d "{\"chat_id\": \"${TELEGRAM_DESTINATION_GROUP_ID}\", \"text\": \"${message}\", \"disable_notification\": true}" \ https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage > /dev/null } # ------------------------------------------------------------------------------------------------ ### START ### BASE=`dirname ${0}` ${BASE}/backup_infobase_1c_generic.sh "${STORAGE}" "${SRV}" "${REF}" "${LOGIN}" "${PASSWORD_FILE}" "${KEEP_BACKUPS_FOR_LAST_DAYS}" "${BACKUP_TIMEOUT_SEC}" res=$? if [ ${res} -eq 0 ]; then send_message_telegram "[Успешно]\nРезервное копирование информационной базы '${REF}' выполнено успешно" else send_message_telegram "[Ошибка]\nРезервное копирование информационной базы '${REF}' не выполнено" fi EOF
Делаем файл исполняемым
chmod +x /opt/1c_backup_scripts/backup__my_super_infobase.sh