четверг, 24 ноября 2011 г.

Связка 1С 8.2 Server + PostgreSQL 9.0.1 на Ubuntu Server 10.04 LTS + 1C 8.2 клиент под Wine на Ubuntu Desktop 10.04 LTS.

На сайте http://v8.1c.ru/overview/postgres_patches_notes.htm есть три патча: 1c_FULL_90-0.19.patch
postgresql-1c-9.0.1.patch
applock-1c-9.0.1.patch

Попытки пропатчить ими PostgreSQL не принесли результата. Поэтому для корректной установки PostgreSQL использовались уже исправленные исходники PostgreSQL 9.0.1 для 1С, любезно предоставленные Alsigned http://www.alsigned.ru/?dl_name=postgresql-9.0.1-1C.tar.gz (спасибо огромное ему за труд).

В данной статье описывается сборка и установка PostgreSQL-9.0.1 для работы с сервером 1С Предприятия 8.2 (платформа 8.2.14,540), используемая операционная система Ubuntu 10.04 x86.

1. Установка PostgreSQL 9.0.1

Устанавливаем необходимые для сборки пакеты:
#apt-get install libreadline-dev libicu-dev patch zlib1g-dev

Переходим в директорию /usr/local/src, скачиваем и распаковываем исходники:
# cd /usr/local/src
# wget http://www.alsigned.ru/?dl_name=postgres
ql-9.0.1-1C.tar.gz -O postgresql-9.0.1.tar.gz # tar xzvf postgresql-9.0.1.tar.gz
Переходим в каталог с исходниками, конфигурируем, собираем и устанавливаем:
# cd postgresql-9.0.1
# ./configure --disable-integer-datetimes --prefix=/usr
# make && make install

Переходим в каталог contrib, собираем и устанавливаем:
# cd contrib
# make && make install

2. Настройка PostgreSQL 9.0.1

Создаем пользователя и группу postgres:
# groupadd -r postgres
# useradd -g postgres -r -d /mnt/base/utp -s /bin/bash postgres

Создаем директорию для PostgreSQL
# mkdir /mnt/base/utp
# chown postgres:postgres /mnt/base/utp

Замечание! Кталог /mnt/base/utp - это так называемый "рабочий каталог", т.е. в нем будут храниться ВСЕ базы данных (в подкаталоге base , он будет автоматически создан при инициализации каталога баз данных)

Важно! Права на каталог /mnt/base/  - должны быть 777, а на /mnt/base/utp - должны быть 700



Генерируем локали en_US и ru_RU.UTF-8 необходимые для работы PostgreSQL с 1с:
# locale-gen en_US ru_RU.UTF-8

Инициализируем базу и установим пароль для postgres. На 32-битной машине может потребоваться сделать

# echo 134217728 >/proc/sys/kernel/shmmax
# echo 134217728 >/proc/sys/kernel/shmall

И чтобы руками их постоянно не менять,впишем их значения в sysctl.conf

# echo kernel.shmmax=134217728 >>/etc/sysctl.conf
# echo kernel.shmall=134217728 >>/etc/sysctl.conf

Инициализируем каталог баз данных:
# su postgres
$initdb -D /mnt/base/utp --locale=ru_RU.UTF-8

The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale ru_RU.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "russian".
. . . . .
. . . . .
Success. You can now start the database server using:
postgres -D /mnt/base
or
pg_ctl -D /mnt/base/utp -l logfile start

Запускаем PostgreSQL:
#pg_ctl -D /mnt/base/utp start

Задаем пароль пользователя БД:
#psql -U postgres -c "alter user postgres with password 'наш_пароль';"
#exit

Делаем скрипт для запуска-остановки, для этого создаем файл /etc/init.d/postgresql следующего содержания:

#!/bin/sh
# Скрипт запуска/остановки PostgreSQL-9.0-1C
DATADIR=/mnt/base/utp
PGCTL=/usr/bin/pg_ctl
PGUSER=postgres
case $1 in
start)
sudo -u $PGUSER -H $PGCTL -D $DATADIR start
;;
stop)
sudo -u $PGUSER -H $PGCTL -D $DATADIR stop
;;
restart)
sudo -u $PGUSER -H $PGCTL -D $DATADIR stop
sudo -u $PGUSER -H $PGCTL -D $DATADIR start
;;
*)
echo start|stop|restart
return 1;
;;
esac

Даем разрешения на запуск и добавляем сервис в автозапуск:
#chmod u+x /etc/init.d/postgresql
#update-rc.d postgresql defaults

Теперь необязательное редактирование postgresql.conf . Значения , устанавливаемые в этом файле зависят от многих факторов и собственно служат для настройки оптимальной производительности.

#mcedit /mnt/base/utp/postgresql.conf

listen_addresses = ‘127.0.0.1′ - если соединения с базой будут только с локального хоста, то надежнее сделать именно так, чтобы порт 5432 слушался только на адресе 127.0.0.1 (в нашем случае оставляем по умолчанию '*' , т.к. соединения с базой будут не локально!!!).

fsync = off - значение on сильно снижает производительность, поскольку все транзакции непосредственно пишутся на жесткий диск без использования кэширования, но повышается надежность. Значение off есть смысл устанавливать, когда установлены надежные диски и надежный же UPS .

effective_cache_size = 4096MB - на сервере 8Гб ОЗУ, этот параметр надо выставить в половину ОЗУ, как рекомендует 1С для постгреса 8.2

work_mem = 16MB - насколько я понимаю, этот параметр зависит от среднего размера таблиц, в любом случае, для тонкой настройки надо тестировать на конкретном сервере с конкретной базой (оставляем по умолчанию).

Перезапускаем службу и проверяем, запустился ли PostgreSQL:

# service postgresql restart

Вы должны получить примерно следующее сообщение:
Stopping postgresql service: DONE
Starting postgresql service: DONE

Проверяем, слушается ли 5432 порт:
# netstat -atn|grep 5432

Если в ответ получился, вот такой выхлоп, то всё нормально:
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN

или
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN // если Вы в файле postgresql.conf указали слушать только локальные подключения.

На этом этапе установка PostgreSQL завершена. Приходим к установке сервера 1C 8.2.

3. Установка сервера 1cv82

Здесь не должно возникнуть сложностей с установкой. Скидуем deb-пакеты версии 8.2.14-540_i386 в каталог /usr/local/srv1c и устанавливаем.

Список пакетов:
1c-enterprise82-common-nls_8.2.14-540_i386.deb
1c-enterprise82-common_8.2.14-540_i386.deb
1c-enterprise82-crs-nls_8.2.14-540_i386.deb
1c-enterprise82-crs_8.2.14-540_i386.deb
1c-enterprise82-server-nls_8.2.14-540_i386.deb
1c-enterprise82-server_8.2.14-540_i386.deb
1c-enterprise82-ws-nls_8.2.14-540_i386.deb
1c-enterprise82-ws_8.2.14-540_i386.deb

По сути, нам нужны лишь 2 пакета 1c-enterprise82-server_8.2.14-540_i386.d
eb и 1c-enterprise82-common_8.2.14-540_i386.deb , т.к. пакеты «-nls» - это языковая поддержка. Нам она не нужна, русский язык есть в основной поставке. Пакет «-ws» - это веб-сервисы. Но они есть не просят, поэтому на перспективу я их оставил.

#cd /usr/local/svr1c
#dpkg -i 1c*.deb

Программа устанавливается по умолчанию в каталог /opt/1C/v8.2/i386/

Устанавливаем дополнительные пакеты, которые необходимы для нормальной работы сервера:
# apt-get install imagemagick ttf-mscorefonts-installer libgsf-1-114 texlive-base unixodbc

Далее переходим в каталог утилиты и запускаем config_server:
# cd /opt/1C/v8.2/i386/utils
#./config_server

Если утилита немного задумалась и не произошло никакого выхлопа в ответ, то это значит, что сервер 1С настроен правильно и больше ничего не нужно для нормального функционирования.

!!!!! На Ubuntu 12.04 появилась проблема со скриптом  ./config_server. При запуске он может не обнаруживать установленных дополнительных библиотек и сообщать "Please install following package: <имя пакета>" при установленном пакете. Либо, в некоторых случаях, при запуске тонкого клиента может происходить ошибка "Ошибка инициализации графической подсистемы".
Лечится так. Правим ./config_server:

# cd /opt/1C/v8.2/i386/utils
#mcedit ./config_server

В начало функции getLibPath добавить:
для 32bit
checkPath lib $ARCH && { echo /usr/lib; return; }

для 64bit
checkPath lib/x86_64-linux-gnu $ARCH && { echo /usr/lib/x86_64-linux-gnu; return; }


тело функции checkInstalledLibs заменить на:
для 32bit
SYSTEM_LIB_PATH="/usr/lib"
checkLib MagickWand Wand || checkLib Wand || askToInstall ImageMagick
checkLib gsf-1 || askToInstall libgsf

для 64bit
SYSTEM_LIB_PATH="/usr/lib/x86_64-linux-gnu"
checkLib MagickWand Wand || checkLib Wand || askToInstall ImageMagick
checkLib gsf-1 || askToInstall libgsf




Даем пользователям 1С сервера права на запись:
# chown -R usr1cv82:grp1cv82 /opt/1C

Добавляем сервер 1С в автозапуск:
# update-rc.d srv1cv82 defaults

В ответ Вы должны получить следующий выхлоп:

Adding system startup for /etc/init.d/srv1cv82 ...
/etc/rc0.d/K20srv1cv82 -> ../init.d/srv1cv82
/etc/rc1.d/K20srv1cv82 -> ../init.d/srv1cv82
/etc/rc6.d/K20srv1cv82 -> ../init.d/srv1cv82
/etc/rc2.d/K20srv1cv82 -> ../init.d/srv1cv82
/etc/rc3.d/K20srv1cv82 -> ../init.d/srv1cv82
/etc/rc4.d/K20srv1cv82 -> ../init.d/srv1cv82
/etc/rc5.d/K20srv1cv82 -> ../init.d/srv1cv82

Перезагружаем сервер. Проверяем запускаются ли при старте системы постгрес и сервер 1С:
#netstat -atn |grep 0.0.0.0:15

tcp 0 0 0.0.0.0:1540 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1541 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1560 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1561 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1562 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1564 0.0.0.0:* LISTEN

Если в ответ Вы видите такой список портов, то всё отлично (а если, нет портов 1541 или других, то не запустился процесс rphost и это не есть хорошо).

Так же можно для профилактики проверить, все ли процессы сервера запущены нормально:
#ps aux|grep 1c

От имени пользователя usr1cv82 должно быть запущено три процесса: ragent, rmngr и rphost. После имен процессов идут номера портов, на которых они работают:

usr1cv82 1217 0.0 0.1 111784 15432 ? Ssl Nov18 1:10 /opt/1C/v8.2/i386/ragent -daemon
usr1cv82 1220 0.4 0.3 262420 32660 ? Sl Nov18 25:54 /opt/1C/v8.2/i386/rmngr -port 1541 -range 1560:1591
usr1cv82  4034 6.5 4.5 651928 375684 ? Sl Nov20 184:46 /opt/1C/v8.2/i386/rphost  -range 1560:1591 -reghost titan -regport 1541 -pid  27e017b0-11f0-11e1-7f8e-3c4a92f1a084


Если процесса не три, а один (такое почему-то иногда бывает, но только при первоначальном запуске), то делаем:
# invoke-rc.d srv1cv82 stop

Удаляем каталог «.1cv82» в домашней директории пользователя usr1cv82. И перезапускаем сервер заново. Должно стать все нормально.

На этом этапе всё готово для создания БД из под оснастки Windows "Администрирование серверов предприятия"!!!!!!!!!!!!!!!!!!!


4. Установка клиента
Установка клиента - это довольно обширная тема, по этому она рассмотрена отдельной статьей 

5. Установка HASP и настройка лицензионного подключения к БД.
Дабы не замарачиваться, возьмем уже готовые и собранные пакеты HASP драйвера и демона на ETRESOFT`e. Копируем пакеты в директорию установки /usr/local/HASP и устанавливаем:
#cd /usr/local/HASP
#dpkg -i *.deb

тушим сервер:
#shutdown -h now

вставляем флешки-ключи и запускаем сервак...

Проверить работает ли HASP-ключ можно командами:
#service haspd status

должно быть что то похожее на:
Hardware protection keys support bundle. Etersoft (c) 2008-2010
HASPD package 3.2 with /dev/bus/usb support
Aladdin HASP 4/HL/SRM driver status:
kernel module aksparlnx is not loaded (WARNING: HASP LPT keys support is disabled! Run service haspd build if needed.)
aksusbd is running
winehasp is running
hasplm is running
hasplmd is running
Daemon version: 1.14 (#7779) - key API (USB) version: 3.88 (parallel driver not available)
/proc/bus/usb workaround is enabled
Smartkey 3 USB/LPT driver status:
skeyd is stopped
SafeNet Sentinel status:
usbsentinel is stopped
SntlKeysSrvrlnx is stopped

Ну и еще одна проверка:
#netstat -ap | grep hasp

должны увидеть, что демон слушает 475 порт:
tcp        0      0 *:1947                  *:*                     LISTEN      1143/hasplmd   
udp       0      0 localhost:2790       *:*                                      1125/winehasp  
udp       0      0 *:1947                  *:*                                      1143/hasplmd   
udp      0      0 *:475                   *:*                                     1134/hasplm
udp       0      0 *:51937                *:*                                      1143/hasplmd   
unix  3      [ ]         STREAM     CONNECTED     6106     1134/hasplm        
unix  3      [ ]         STREAM     CONNECTED     5392     1143/hasplmd       
unix  3      [ ]         STREAM     CONNECTED     5390     1143/hasplmd       
unix  2      [ ]         DGRAM                              5150     1143/hasplmd       
unix  2      [ ]         DGRAM                              5137     1134/hasplm        
unix  2      [ ]         DGRAM                              5124     1125/winehasp     


6. Создаем скрипт автоматического BACKUP`a БД.

Этот скрипт нужен для автоматического бекапа БД и чистки от старых бекапов.

Собственно, приступим, создаем директорию бекапов и скрипт сответственно:
#mkdir /mnt/1c/Backup1C
#cd /mnt/1c/Backup1C/
#mcedit backup1c

и в ставляем в скрипт следующее содержание:
#!/bin/bash

# Скрипт запуска резервного копирования БД 1С (храним 5 последних копий)

BACKUPDIR=/mnt/1c/Backup1C/                 # Директория хранения бэкапов
DATENAME=`date +%d.%m.%Y-%H.%M` # Дата/Время в имени файла бэкапа
LOGFILE=/var/log/Backup1C.log                  # Хранилище лог-файлов
X=1                                                            # Счетчик файлов
FILEMASK="*.backup"                                # маска файлов
KEEP=4                                                      # сколько файлов (бэкапов) надо оставлять 
BASE=utp                                                   # база данных
 
cd $BACKUPDIR
echo Удаление старых резервных копий базы данных...

for i in `ls -t $BACKUPDIR/$FILEMASK`
do
if [ $X -le $KEEP ]
then
((X++))
continue
fi
rm $i
done

echo Начато резервное копирование базы данных... 
 
pg_dump -h localhost -U postgres -Fc -Z9 -c -f $DATENAME.utp.backup $BASE
echo "Резервное копирование БД УТП завершено: $DATENAME" > $LOGFILE

####LAST LINE. DO NOT REMOVE####

Смысл дествий скрипта такой:
Проверка количества старых бекапов, удаление всех старых бекапов (кроме 4х последних - параметр KEEP) и непосредственный бекап текущего состояния БД с логированием в /var/log/Backup1C.log

Теперь, для автоматического выполнения этого скрипта, добавим его в crontab:
#mcedit /etc/crontab

и добавляем туда строку:
00 3 * * * root /mnt/1c/Backup1C/backup1c

т.е. скрипт /mnt/1c/Backup1C/backup1c будет выполняться каждый день в 3:00


7. Восстановление БД из BACKUP`a.

Все действия выполняются от имени пользователя postgres. Логинимся в него:

$sudo su postgres

Далее порядок действий такой:

  • удаляем существующую БД
  • $dropdb <ИМЯ_БД>
     
  • создать новую БД с 0-шаблоном
  • $createdb -T template0 <ИМЯ_БД>
     
  • восстановить данные из backup`a во вновь созданную БД
  • $pg_restore -d <ИМЯ_БД> <ПУТЬ+ИМЯ_BACKUP`a>
     
  • через оснастку "Администрирование серверов предприятия" добавить БД в кластер 1С

Комментариев нет:

Отправить комментарий