1c
Содержание
- 1 В GNU/Linux
- 1.1 Установка учебной платформы 8.5.x на ОС Альт Стартеркит p11 GNOME
- 1.2 Публикация REST/Odata на веб-сервере
- 1.3 Автоматизация резервного копирования информационных баз
В GNU/Linux
Установка учебной платформы 8.5.x на ОС Альт Стартеркит p11 GNOME
Обновить ОС и ядро
su - apt-get update -y && apt-get dist-upgrade -y && update-kernel -y
Поставить пакеты
su - apt-get install -f alt-tour firefox libwebkit2gtk 1c-preinstall-full libglui
Включить sudo su
Раскоментировать в файле:
/etc/sudoers
строчку:
WHEEL_USERS ALL=(ALL:ALL) ALL
или строчку:
WHEEL_USERS ALL=(ALL:ALL) NOPASSWD: ALL
(если необходимо выполнять sudo su без пароля)
Установить платформу
Предполагается, что есть файл установки платформы:
setup-training-8.5.1.1150-x86_64.run
Тогда установка осуществляетс следующим образом:
chmod +x setup-training-8.5.1.1150-x86_64.run sudo ./setup-training-8.5.1.1150-x86_64.run
Далее следуем инструкциям установщика. В установщике необходимо выбрать пункт "Установить ярлыки".
Установщик сам переключится в режим текстового интерфейса, если не найдёт дисплей (например, при установке по ssh). А вообще он имеет графический интерфейс...
Починить запуск платформы (актуально для ОС Альт веток p10 и p11 как минимум)
Пробуем запустить:
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t
Получилось? Если да, то странно... Должна быть такая ошибка:
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libwebkit2gtk-4.0.so.37) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by /lib64/libwebkit2gtk-4.0.so.37) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib64/libwebkit2gtk-4.0.so.37) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by /lib64/libjavascriptcoregtk-4.0.so.18) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libjavascriptcoregtk-4.0.so.18) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib64/libjavascriptcoregtk-4.0.so.18) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libicuuc.so.74) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib64/libjxl.so.0.11) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libgcc_s.so.1: version `GCC_12.0.0' not found (required by /lib64/libhwy.so.1) /opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libgcc_s.so.1: version `GCC_13.0.0' not found (required by /lib64/libhwy.so.1)
Не такая ошибка? Если да, то вы точно все пункты до этого выполнили (точно пакеты все установлены, которые выше в команде установки пакетовв перечислены)?
Если ошибка такая, то чиним:
sudo rm -f /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6 sudo rm -f /opt/1cv8t/x86_64/8.5.1.1150/libgcc_s.so.1
Пробуем запустить ещё раз:
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t
Всё должно работать. Теперь можно запускать платформу посредством ярлыков (кнопок меню приложений)
По прежнему не запускается? Если да, то спешим на встречу новым приключениям!
Переопределить настройки по умолчанию для ОС Альт
Перезагрузиться
Каталог для файловых баз данных платформы 1С и sgid-bit
Поскольку полный путь до каталога с файловой базой данных будет фигурировать в конфигурационных файлах веб-сервера, его рекомендуется сделать отличным от пути по умолчанию, который предлагает платформа 1С.
Например, так:
mkdir ~/bases
При публикации базы данных через веб-сервер необходимо чтобы у процесса веб-сервера, запущенного от пользователя
apache2
был доступ на чтение и запись в каталог с базой данных конфигурации 1С.
Один из вариантов это сделать следующий:
1. Разрешаем членам группы-владельца каталога чтение и запись
chmod g+rwx ~/bases -R
2. Устанавливаем sgid бит на каталог
chmod g+s ~/bases -R
3. Добавляем пользователя apache2 в группу-владельца каталога
sudo usermod -aG user apache2
Публикация REST/Odata на веб-сервере
Предполагается что до этого были выполнены все действия в предыдущем разделе...
Устанавливаем и включаем веб-сервер apache2
sudo apt-get install -y apache2 sudo systemctl enable --now httpd2
Создаём симлинк для httpd2
Для скриптов платформы 1С это важно...
ln -s /sbin/httpd2 /sbin/httpd
Публикуем командой
Сначала создаём файл (оно само не может):
sudo touch /etc/httpd2/conf/sites-enabled/1c_odata.conf
Потом публикуем:
sudo HOME=/home/user /opt/1cv8t/x86_64/8.5.1.1150/webinstt -apache24 -wsdir odata_base -dir /var/www/odata_base -connstr "File=/home/user/bases/base1;" -confPath /etc/httpd2/conf/sites-enabled/1c_odata.conf
В ответ должно прийти что-то типа этого:
Публикация выполнена
или этого:
Публикация обновлена
Примерное содержимое файла в контексте конфигурационных файлов веб-сервера apache2:
cat /etc/httpd2/conf/sites-enabled/1c_odata.conf
LoadModule _1cws_module "/opt/1cv8t/x86_64/8.5.1.1150/wsap24t.so"
# 1c publication
Alias "/odata_base" "/var/www/odata_base/"
<Directory "/var/www/odata_base/">
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "/var/www/odata_base/default.vrd"
</Directory>
Исправляем параметр в конфигурации сервиса
Исправляем значение параметра:
sed -i 's/ProtectHome=yes/ProtectHome=no/g' /lib/systemd/system/httpd2.service
После этого перезагрузим демона systemd
systemctl daemon-reload
Перезапускаем веб-сервер
systemctl restart httpd2
Проверяем публикацию
Идём браузером по адресу:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/e1csys/vrscore/exception.xslt?sysver=8.5.1.1150"?><exception xmlns="http://v8.1c.ru/8.2/virtual-resource-system" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Exception" clsid="580392e6-ba49-4280-ac67-fcd6f2180121" reason="500"><descr xmlns="http://v8.1c.ru/8.1/data/core">Error loading file-based infobase support components</descr><inner xmlns="http://v8.1c.ru/8.1/data/core" xsi:type="Exception" clsid="d294e384-7ea6-49c6-be96-f3a6e3de1242"><descr>Error when loading component 'help'</descr><inner xsi:type="Exception" clsid="9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3"><descr>File access error '/home/user'. 13(0x0000000D): Permission denied</descr><data>77u/ew0KezlkYjFmYTM3LWI0NTUtNGYzZi1iOGRkLTdkZTBlYTdkNmRhMywiRmls
Автоматизация резервного копирования информационных баз
Предполагается, что платформа "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
LOCK_FILE_PATH="/home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntx8e79a393-c2af-4fd7-b25a-af6b5ed19bfa/snccntx.dat"
#-----------------------------
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"
TMP_STORAGE="/opt/1c_backup_scripts/tmp_storage"
ib_tmp_filepath="${TMP_STORAGE}/${REF}__${infobase_suffix}"
ib_tmp_log="${ib_tmp_filepath}.log"
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
#echo "f=$f"
datetime_from_file=`echo ${f} | awk -F '__' {'print $2'} | awk -F '.' {'print $1'}`
#echo "datetime_from_file=${datetime_from_file}"
#2023-12-24-22-01-02
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_tmp_log})
# start apache2
sudo systemctl start httpd2
if [ "${res_text}" = "${nice_text}" ]; then
/bin/cp ${ib_tmp_filepath} ${ib_filepath} && /bin/rm ${ib_tmp_filepath}
/bin/cp ${ib_tmp_log} ${ib_log} && /bin/rm ${ib_tmp_log}
#echo "TEST: ${ib_filepath} AND ${ib_log}"
rotate_backups
exit 0
fi
exit 1
fi
#echo "pid alive: ${1}"
sleep 1
TIMEOUT_COUNTER=$(($TIMEOUT_COUNTER+1))
wait ${1}
}
# prepare tmp storage
[ ! -d ${TMP_STORAGE} ] && sudo mkdir "${TMP_STORAGE}" && sudo chown administrator: "${TMP_STORAGE}" -R
# stop apache2
sudo systemctl stop httpd2
sleep 2
# reset srv1cv8 sessions
sudo systemctl stop srv1cv8
sleep 2
sudo /bin/rm -f "${LOCK_FILE_PATH}"
sudo systemctl start srv1cv8
sleep 2
DISPLAY=:0 XAUTHORITY=/home/administrator/.Xauthority ${bin1c} CONFIG /N "${LOGIN}" /P "${PASSWORD}" /S "${SRV}/${REF}" /DumpIB "${ib_tmp_filepath}" /OUT "${ib_tmp_log}" &
main_process_pid=$!
wait ${main_process_pid}
Делаем файл исполняемым
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
Ставим задачу для планировщика cron
Под пользователем
administrator
в терминале открываем временный файл для настройки crontab
EDITOR=nano crontab -e
в результате редактором
nano
будет открыт временный файл для установки параметров планировщика для текущего пользователя. Отредактировав и сохранив (Ctrl+O - Enter) изменения в этом файле и закрыв редактор (Ctrl+X) будет сконфигурирован планировщик для текущего пользователя.
Проверить корректность заданных параметров планировщика можно выполнением команды
crontab -l
В случае, если планировщик был сконфигурирован на запуск скрипта резервного копирования каждые сутки с 23:01, вывод команды проверки должен быть примерно такой:
#minute (0-59), #| hour (0-23), #| | day of the month (1-31), #| | | month of the year (1-12), #| | | | day of the week (0-6 with 0=Sunday). #| | | | | commands 1 23 * * * /opt/1c_backup_scripts/backup__my_super_infobase.sh