Поднимаем сервер 1C 8.x (Ubuntu Server + PostgreSQL)
Ранее, я уже делал обзор посвящённый установке 1С8 на CentoOS, теперь пришла очередь не менее популярной линукс-оси Ubuntu. На момент написания статьи, стабильной версией убунты является 12.04, ее и будем использовать.
Итак, в данной заметке будем настраивать связку Ubuntu Server x64 + Postgre@Etersoft9 + 1C 8.2.15.301. Не будем вдаваться в подробности установки операционной системы, там все предельно понятно, за исключением разве, что возможных граблей с некорректным отображением русских символов в командных диалогах (если во время установки был выбран русский язык). Но решение имеется. Так же во время установки, надо не забыть отметить чекбокс напротив устанавливать ssh-сервер (если нужен) и samba-server (нужен 1С-у);
1) Подготовка:
Настроем сеть, будем использовать статическую адресацию:
sudo vi /etc/network/interfaces
auto eth0 iface eth0 inet static address 192.168.1.8 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.1 dns-nameservers 192.168.1.4 192.168.1.6
где, auto eth0 - говорит системе, что интерфейс eth0 необходимо включать автоматически при загрузке системы с нижеуказанными параметрами.
iface eth0 inet static - указывает на то, что eth0 использует статический интерфейс. Если используется DHCP-сервер, то пишем вместо static - dhcp.
С 12.04 за конфигурацию DNS отвечает программа resolvconf (вместо файла /etc/resolv.conf) поэтому, если не используется DHCP-сервер, DNS-сервера для статических интерфейсов необходимо вносить в /etc/network/interfaces используя параметры dns-nameservers, dns-search и dns-domain, соответствующие параметрам nameserver, search и domain в resolv.conf.
Рестарт службы:
sudo /etc/init.d/networking restart
Обновляемся:
sudo apt-get update && apt-get dist-upgrade
2. Установка и настройка сервера баз данных PostgreSQL
Для удобства, что бы не набирать каждый раз sudo перейдем в режим рута:
sudo -i
Ставим пакеты необходимые для правильной работы PostgreSQL:
apt-get install libicu-dev libxslt1.1 libxml2 libossp-uuid16 libreadline5
Ставим последнюю стабильную версию PostgreSQL командой:
apt-get install postgresql
После этого в системе появится пользователь postgres, будет создан скрипт /etc/init.d/postgresql для старта и остановки СУБД.
После, даем права на папку pgsql пользователю и группе postgres:
chown postgres:postgres /var/lib/pgsql
Задаем пароль пользователю postgres:
passwd postgres
Редактируем /etc/group, где существующий id группы tape:x:26: меняем на какой-нибудь другой, например 27 :). В итоге, должны быть следующие строки:
postgres:x:26: tape:x:27:
Стартуем сервис командой, указываем значение переменной LANG. Необходимо для первичного создания базы:
LANG=ru_RU.utf—8 service postgresql start
Может ругнутся, что текущее значения Shmmax слишком мало для запуска PostgreSQL и предложить указать своё, но мы поступим умнее и воспользуемся следующим скриптом, который посчитает и выведет нужный размер Shmmax и Shmall в байтах.
SHMMAX - это максимальный размер (в байтах) на сегменте shared memory равный половине всей доступной памяти на сервере.
SHMALL - общее количество разделяемой памяти (в страницах), какое все процессы на сервере могут использовать.
Затем пропишем полученные значения с помощью команды:
echo "kernel.shmmax = 521981952" >> /etc/sysctl.conf echo "kernel.shmall = 127437" >> /etc/sysctl.conf
Или пропишем в /etc/sysctl.conf вручную. Для того что бы изменения вступили в силу, набираем:
sysctl -p
Авторизуемся под пользователем Postgres и назначим пароль внутреннему пользователю PostgreSQL:
su postgres
psql postgres alter user postgres with password 'YOUR_PASSWORD';
Набираем \q что бы выйти из консоли.
Файл /var/lib/pgsql/data/pg_hba.conf приводим к следующему виду:
#IPv4 local connections: host all postgres 0.0.0.0/0 md5
Главный конфиг /var/lib/pgsql/data/postgresql.conf редактируем в соответствии со следующими данными.
Усредненная настройка наиболее важных параметров:
shared_buffers = 1/8 RAM или больше (но не более 1/4) work_mem = в 1/20 RAM maintenance_work_mem = в 1/4 RAM max_fsm_relations = в планируемое кол-во таблиц в базах * 1.5 max_fsm_pages в max_fsm_relations * 2000; fsync = true wal_sync_method = fdatasync commit_delay = от 10 до 100 commit_siblings = от 5 до 10 effective_cache_size = 0.9 от значения cached, которое показывает free random_page_cost = 2 для быстрых cpu, 4 для медленных cpu_tuple_cost = 0.001 для быстрых cpu, 0.01 для медленных cpu_index_tuple_cost = 0.0005 для быстрых cpu, 0.005 для медленных
Для оптимизации настроек рассчитанных на максимальную производительность, можно попробовать воспользоваться утилитой pgtune.
Вбиваем свои данные и получаем на выходе правильный postgresql.conf
Более полную информацию по настройке postgresql.conf смотрим у Etersoft или применительно к 1С на сайте Вечеслава Гилева.
Наиболее часто используемые команды Postgresql:
Изменить root-пароль:
ALTER USER postgres WITH PASSWORD ‘newpassword’;
Shell-команда |
Интерактивный режим psql |
Описание |
createdb name |
CREATE DATABASE name; |
Создание новой базы данных |
ALTER DATABASE name; |
Изменение параметров БД |
|
dropdb |
DROP DATABASE name; |
Удаление базы данных |
createuser |
CREATE USER name [ [ WITH ] option [ ... ] ] |
Создание нового пользователя |
ALTER USER name [ [ WITH ] option [ ... ] ] |
Изменение параметров пользователя |
|
dropuser |
DROP USER [ IF EXISTS ] name [, ...] |
Удаление пользователя |
vacuumdb |
Дефрагментация БД |
|
Назначение привилегий |
||
Отмена привилегий |
3. Установка 1С Предприятие 8
Для правильной работы сервера 1С Предприятие, установим следующие пакеты:
sudo apt-get install imagemagick libglib2.0-dev libgsf-1-dev texlive-base ttf-mscorefonts-installer libfreetype6 libfreetype6-dev unixodbc unixodbc-dev
Качаем технологическую платформу 1С8.2 для Linux (Debian/Ubuntu) с сайта 1С.
Установку пакетов необходимо производить в следующем порядке, т.к. существуют зависимости.
Если устанавливать всё сразу по маске, могут возникнуть ошибки.
1) 1c-enterprise82-common_8.2.15-319_amd64.deb // общие компоненты сервера
2) 1c-enterprise82-common-nls_8.2.15-319_amd64.deb // национальные ресурсы для общих компонент
3) 1c-enterprise82-server_8.2.15-319_amd64.deb // сервер 1С:предприятие 8.2 для Linux
4) 1c-enterprise82-server-nls_8.2.15-319_amd64.deb // Национальные ресурсы для сервера 1С
5) 1c-enterprise82-ws_8.2.15-319_amd64.deb // адаптер для публикации Web—сервисов 1С:Предприятия 8 на веб-сервере на основе Apache HTTP Server 2.0 или Apache HTTP Server 2.2;
6) 1c-enterprise82-ws-nls_8.2.15-319_amd64.deb // Национальные ресурсы для компонент веб-сервисов 1с8.2
Добавляем в автозагрузку:
update-rc.d srv1cv82 defaults
Пользователю usr1cv82 разрешаем писать в /opt/1C и /home/usr1cv82
chown -R usr1cv82:grp1cv82 /opt/1C chown -R usr1cv82:grp1cv82 /home/usr1cv82
Перезапускаем сервер. Проверяем корректность старта службы:
service srv1cv82 status
Должно высветится:
init script: STARTED Ragent: RUNNING
На файрволе, если используется, для работы сервера 1С должны быть открыты следующие порты: tcp:1540 — агент сервера (ragent) tcp:1541 — главный менеджер кластера (rmngr) tcp:1560-1591 — диапазон сетевых портов для динамического распределения рабочих процессов. (достаточно открыть tcp:1560)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1540 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 1541 -j ACCEPT -A INPUT -p tcp -m multiport --dports 1560:1591 -j ACCEPT
Проверка работоспособности рабочих процессов сервера:
netstat -tlnp | grep :15
Должны получить примерно такую картинку:
tcp 0 0 0.0.0.0:1560 0.0.0.0:* LISTEN 2814/rphost tcp 0 0 0.0.0.0:1540 0.0.0.0:* LISTEN 2799/ragent tcp 0 0 0.0.0.0:1541 0.0.0.0:* LISTEN 2802/rmngr
Но, получаем следующее:
tcp 0 0 0.0.0.0:1540 0.0.0.0:* LISTEN 960/ragent
Так же просмотреть запущенные процессы можно с помощью команды:
ps aux|grep 1C
Должны получить примерно следующее:
usr1cv82 931 0.0 1.8 338376 18612 ? Ssl Jul04 0:41 /opt/1C/v8.2/x86_64/ragent -daemon usr1cv82 935 0.1 3.0 790496 31376 ? Sl Jul04 2:31 /opt/1C/v8.2/x86_64/rmngr -port 1541 -range 1560:1591 usr1cv82 948 0.4 11.5 720804 117412 ? Sl Jul04 6:21 /opt/1C/v8.2/x86_64/rphost -range 1560:1591 -reghost ubuntus12 -re
Но запускается только ragent:
usr1cv82 931 0.0 1.8 338376 18612 ? Ssl Jul04 0:41 /opt/1C/v8.2/x86_64/ragent -daemon
К сожалению танцы с бубном ни к чему не привели, и права выставлены везде корректно и сеть настроена должны образом. Нагуглил, что с 15 релизом у многих похожие проблемы, а у меня как раз 8.2.15-319. А 318 Помнится работал :) Решил попробовать самый последний на момент написания обзора 8.2.16.362 и о чудо, с первого раза все завелось как надо.
Теперь необходимо проверить корректность установки компонентов, которые мы установили в самом начале с помощью проверяющего скрипта /opt/1C/v8.2/x86_64/utils/*config_server
Если, не получаем не каких сообщений, а в директории /opt/1C/v8.2/x86_64/conf/grcmncfg появился файлик type.xml то значит все ок, в моем случае, скрипт выдает кучу ошибок. В первом сообщение говорится, что невозможно получить доступ к какому-то файлу libc.
Cannot access /lib/libc-*.so: No such file or directory Cannot access /lib64/libc-*.so: No such file or directory
Посмотрим, где этот файл на самом деле сидит:
find / -name "libc-*.so" -print
Получаем следующий выхлоп:
/lib/x86_64-linux-gnu/libc-2.15.so
Неудивительно что скрипт его не находит, делаем поочередно два симлинка:
ln -s /lib/x86_64-linux-gnu/libc-2.15.so /lib/libc-2.15.so ln -s /lib/x86_64-linux-gnu/libc-2.15.so /lib64/libc-2.15.so
После чего, снова запускаем скрипт. Ошибка с "доступом" исчезает, но остается следующая:
./config_server: line 193: [: too many arguments ./config_server: line 193: [: too many arguments ./config_server: line 193: [: too many arguments ./config_server: line 193: [: too many arguments ./config_server: line 193: [: too many arguments
В 193 строке содержится следующая запись, которая указывает на опрос переменной $SYSTEM_LIB_PATH, где видимо должны содержаться нужные 1су библиотеки:
[ ! -e $aliasFullName ] && return 1
Посмотрим, что конкретно не может обнаружить скрипт, запускаем:
echo $aliasFullName
Получаем:
Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libWand.so Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libfreetype.so Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libgsf-1.so Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libglib-2.0.so Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libodbc.so
Как я понял, SYSTEM_LIB_PATH должен обнаруживать искомые файлы в трех возможных директориях:
/usr/lib /usr/lib32 /usr/lib64
Так же, необходимо вручную задать SYSTEM_LIB_PATH в /etc/environment. Например пускай ищет библиотеки только в /usr/lib/
SYSTEM_LIB_PATH="/usr/lib"
Перезапускаем сервер, снова запускаем скрипт, получаем следующее:
/usr/lib/libWand.so /usr/lib/libfreetype.so Please install following package: FreeType /usr/lib/libgsf-1.so /usr/lib/libglib-2.0.so Please install following package: libglib /usr/lib/libodbc.so Please install following package: UnixODBC
Файлы libWand.so и libgsf-1.so находятся там где нужно. Остальные файлы libfreetype.so, libglib-2.0.so и libodbc.so находятся в /usr/lib/x86_64-linux-gnu. Соответственно снова делаем смлинки:
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/libfreetype.so ln -s /usr/lib/x86_64-linux-gnu/libglib-2.0.so /usr/lib/libglib-2.0.so ln -s /usr/lib/x86_64-linux-gnu/libodbc.so /usr/lib/libodbc.so
Запускаем повторно скрипт, теперь видим, что все библиотеки в нужных нам директориях.
/usr/lib/libWand.so /usr/lib/libfreetype.so /usr/lib/libgsf-1.so /usr/lib/libglib-2.0.so /usr/lib/libodbc.so
На клиенте, если Windows, заходим в консоль управления 1CV8 Servers (Администрирование серверов 1С Предприятия). Жмем, добавить Центральный сервер 1С:Преприятия 8.2, добавляем по имени. Во вкладке рабочие серверы должна появится запись. Создаем новую базу, либо прямо с помощью консоли управления, либо в самом клиенте 1С выбираем опцию:
Добавить новую информационную базу.
Запускаем 1С. Тест Гилева выдает 13,05 балов.
По поводу HASP-ключей, если до 12 пользователей то нужен только сетевой ключ с маркировкой типа NETXX ORGL8, где XX — количество клиентских лицензий. Если более 12 пользователей, но необходим так же локальный ключ для сервера. Фиолетовый ключ HASP HL с маркировкой типа ENSR8 для 32x-битного сервера или зеленый ключ HASP HL Max маркировкой ENS8SA для 64-битного. Ключ HASP HL Max поддерживает так же 32-битный сервер.
Для нормальной работы HASP-ключей необходимо установить два пакета включающих драйвер ключа aksusbd и менеджер лицензий hasplm. Имеет смысл ставить модифицированные варианты драйверов от Entersoft. Для нормальной работы haspd, требуются поддержка 32-битных программ.
Поэтому добавляем ее установкой пакета ia32-libs.
apt-get install ia32-libs
Теперь сам HASP и менеджер лицензий:
dpkg -i http://download.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/ dpkg -i http://download.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/
Вставляем ключ, перегружаем сервер. Работоспособность ключей проверяем командой:
sudo service haspd status
Должны быть запущенны: aksusbd, winehasp, hasplm, hasplmd.
4. Публикация на веб-сервере
Ставим apache:
apt-get install apache2
Редактируем /etc/apache2/apache2.conf , где задаем директиву ServerName указывающую на имя сервера.
ServerName "ubuntus12"
В противном случае при запуске apach'a получим сообщение:
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
В корневом каталоге сайта, создаем директорию base, где base - имя базы к которой мы будем предоставлять доступ.
mkdir /var/www/base
Теперь нам необходимо, запустить специальный скрипт для публикации базы на веб-сервере:
Переходим в /opt/1C/v8.2/x86_64/ Запускаем скрипт со следующими параметрами:
./webinst -apache22 -wsdir base -dir '/var/www/base' -connStr 'Srvr="ubuntus12";Ref="base";' -confPath /etc/apache2/httpd.conf
Проверяем корректность внесенных изменений. В /etc/apache2/httpd.conf должны быть следующие строки:
LoadModule _1cws_module "/opt/1C/v8.2/i386/wsap22.so" # 1c publication Alias "base" "/var/www/base/" <Directory "/var/www/base/"> AllowOverride None Options None Order allow,deny Allow from all SetHandler 1c-application ManagedApplicationDescriptor "/var/www/base/default.vrd"
В /var/www/base/ так же должен появится файл default.vrd две последние строчки которого должны выглядеть примерно так:
base="/base" ib="Srvr="ubuntus12";Ref="base";
Выдаем права на директорию, перезапускаем Apache:
chown -R www-data:www-data /var/www/base service apache2 restart
Переходим на сайт, предварительно отключив всплывающие окна. http://ubuntus12/base
И получаем следующее сообщение:
Оно, и понятно, без специального сетевого ключа, работать не будет :)
5. Резервное копирование и восстановление:
Даем права пользователю postgres на тут папку куда будем выгружать backup.
chown postgres:postgres /mnt/net
В /mnt/net у меня смонтирована виндовая шара, с помощью команды:
mount -t smbfs -o username=test,password=11111111,iocharset=utf8 //192.168.1.8/distr /mnt/net
Отмонтировать, принудительно закрыв все подключения, если нужно:
umount -l /mnt/net
Резервное копирование (Backup):
pg_dump -U postgres -Fc -Z9 dbname -f /mnt/net/Backup/Base/dbname.dump
где:
-U (пользователь)
-F (формат извлекаемого файла)
с (custom - внутренний формат сжатия pg_dump, возможны так же варианты tar и plain text)
-Z (установить режим сжатия)
0 - 9 (0 - без сжатия, 9 - максимальный режим)
-f (извлекать в этот файл)
Если выгружаем на виндовую шару, необходимо полный доступ для Users.
Востановление (только из под пользователя postgres): В новую базу:
createdb -T template0 newdb
где, template0 - шаблон означающий, что это абсолютно пустая база
pg_restore -d newdb db.dump
Например:
createdb -T template0 mynewbase pg_restore -d mynewbase /mnt/net/my_old_base.dump
С удалением базы и восстановлением ее из дампа:
pg_dump -Fc -Z9 dbname -f dbname.dump dropdb dbname pg_restore -C -d anydbname dbanme.dump
где, С - создать базу
Например:
pg_dump -Fc -Z9 mybase -f /mnt/net/mybase.dump dropdb mybase pg_restore -C -d postgres /mnt/net/mybase.dump
Здесь -d postgres - указание на любую базу данных существующую в кластере база данных. pg_restore использует ее только чтобы выполнить команду CREATE DATABASE для mydb (mybase)
Скрипт автобэкапа:
В .gz
#!/bin/sh BKPDIR="/mnt/net" DATEYMD=`date "+%Y-%m-%d-%a"` // а - указывает на день недели в формате Пн, Вт, Ср...пишет по русски? mkdir -p ${BKPDIR}/PostgreSQL 2>/dev/null // - можно не указывать, если предварительно создать директорию и выставить права. (pg_dump mydb <"${BKPDIR}/PostgreSQL/${DATEYMD}-mydb-PostgreSQL.gz" EOF
В .dump
#!/bin/sh BKPDIR="/mnt/net/PostgreSQL" DATEYMD=`date "+%Y-%m-%d"` pg_dump -Fc -Z9 mydb -f "${BKPDIR}/${DATEYMD}-mydb-PostgreSQL.dump"
Запись в crontab (из под пользователя postgres):
su postgres
crontab -e //добавить задание
crontab -l //просмотр заданий
crontab -r //удалить задание
# запустить в 18:50 минут
50 18 * * * sh /home/scripts/backup.sh
# запускать каждые 15 минут
*/15 * * * * sh /home/scripts/backup.sh