Задача, казалось, несложной - необходимо установить выделенный сервер на новой версии Ubuntu, самостоятельно скомпилировать PostgreSQL из исходников, установить далее две версии серверной части 1С:Предприятия 8.1 и 8.2. Но, при решении задачи всплыло много нюансов.Брать готовый бинарник от EterSoft'а оказалось неверным - общая компиляция под Mandriva, затем препарирование полученного через alien. Нарушается логика расположения файлов конфигурации и библиотек в Ubuntu, плюс отставание от текущего положения дел (уже вышла версия 8.4.4 PostgreSQL, а на ftp.etersoft.ru лежит лишь 8.4.2). Я понимаю, что лучшее враг хорошего, но хочется самому делать выводы, что лучшее, и что хорошее. Поэтому принято решение самостоятельно собрать PostgreSQL с необходимыми патчами.
Серверные части 1С:Предприятия также написаны в расчете на некий средне-универсальный дистрибутив Linux, но тут хотя бы честно. Все ставится в /opt, конфигурационные файлы прописываются в /etc/init.d и домашней директории пользователя usr1cv82(1). Да и изменить мы ничего не можем - доступа к исходникам нет.
Итак. Собираем сам сервер. Корпус, материнская плата, процессор, планки памяти, два одинаковых жестких диска... Я собрал программный RAID1 (зеркало) для надежности хранения (все-таки собирается для "продакшн"), но это совершенно не обязательно. Что обязательно - установка 64-битной версии, объем оперативной памяти для любой СУБД критичен (а 32-битные версии ограничены 4 гигабайтами), благо это сейчас совершенно недорого. Я установил 8 гигабайт. В общем, выбирайте сами. Привод оптических дисков в сервер ставить смысла нет никакого, загрузку можно провести через USB flash, а на будущее выделенному серверу привод совершенно ни к чему - все необходимое докачивается из репозитариев или копируется через утилиту scp.
Скачиваем образ сервера с http://www.ubuntu.com, там же подробнейшая инструкция как сделать загружаемую USB flash из-под любой операционной системы. Загружаемся, инсталлируем. Несколько обязательный комментариев. В принципе, ничего сложного в процессе инсталляции нет, все подробно расписано. Но!
* Выбираем обязательно русский язык, чтобы сервер автоматически настроился на использование русской локали (принципиально для первоначального запуска патченной версии PostgreSQL, да и системные сообщения на русском не лишние)
* Обязательное подключение к Интернету. По ходу дела, программа инсталляции несколько раз докачивает недостающие пакеты, плюс нам нужен доступ к репозитариям для дальнейшей работы.
* В момент попытки получения ip-адреса по dhcp процедуру лучше прервать (особенно если в это время в сети работает dhcp-сервер) или на следующем экране выбрать "Возврат". Все-таки сервер, должен иметь фиксированный адрес и имя. Задаем его самостоятельно.
* Из предлагаемого дополнительного софта ставим лишь OpenSSH, остальное после и самостоятельно.
После инсталляции перезагрузка, вытаскиваем "флэшку" (она больше не нужна), не забываем в BIOS'е установить AHCI - жесткие диски работают быстрее.
После новой установки первым делом:
sudo apt-get install mc
Надо как-то работать в консоли. Затем:
sudo visudo (или воспользуемся редактором из mc)
Добавляем директиву NOPASSWD:ALL для группы %admin, приведя последнюю строку к виду:
%admin ALL=(ALL) NOPASSWD:ALL
Это нам необходимо, чтобы каждый раз не вводить свой пароль для sudo. Так как к консоли сервера кроме администратора никто доступ не имеет (теоретически), то и безопасность это не нарушает. Правилом хорошего тона считается разлогинится после работы. А доступ к консоли без знания пароля получить нельзя, так что если кто и узнает ваш пароль, то и команду sudo выполнит легко. Таким образом, ничего кроме дополнительной потери времени и нервов постоянное парольное подтверждение не дает.
Обновляем установку:
apt-get update
apt-get upgrade
Перезагружаемся, потому как ядро обновится на более свежее.
Устанавливаем NTP-сервер. Время на всех серверах должно быть синхронизировано, иначе в логах потом не разберешься.
apt-get install ntp
В /etc/ntp.conf исправляем строку "server ntp.ubuntu.com" на вашу. Если в локальной сети есть уже работающий сервер времени (у нас это сервер, отвечающий за proxy), то укажите его адрес. Через некоторое время сервер синхронизирует время. Если нет, оставьте, пусть компании Canonical будет приятно.
Подготовительные работы окончены. Приступаем к сборке. Скачиваем с http://v8.1c.ru/overview/postgres_patches_notes.htm три патча:
1c_FULL_84-0.19.2.patch
postgresql-1c-8.4.patch
applock-1c-8.4.1.patch
Пусть вас не смущает то, что патчи для версии 8.4.1 - они отлично становятся и на более старшие версии PostgreSQL (в рамках версии 8.4). Все минорные исправления не затрагивают того, что патчит фирма "1С".
На сервере в домашнем каталоге пользователя-администратора создаем директорию "1С". Копируем в нее любым удобным для нас способом (я использовал scp со своей рабочей станции, можно перекинуть через собственный ftp или через "флэшку") эти три патча. Переименовываем их, добавляя перед названием «20-», «21-» и «22-», т. е. приводим их к виду: 20-1c_FULL_84-0.19.2.patch, 21-postgresql-1c-8.4.patch, 22-applock-1c-8.4.1.patch
Переходим в директорию "1С" и скачиваем туда исходники PostgreSQL:
apt-get source postgresql
После скачивания архивы автоматически распакуются, будут наложены специфичные для Ubuntu патчи (что очень хорошо, так как итоговая сборка будет "родной"). Входим в этот каталог. Затем копируем наши патчи в каталог "/debian/patches/". Далее нам предстоит исправить три файла, ответственных за правильную сборку пакета. Все три файла содержаться в каталоге "debian".
Файл "changelog". Отвечает за правильное наименование пакетов после сборки. Добавляем туда следующие строки в начало файла любым текстовым редактором (например, через mc):
postgresql-8.4 (18.4.4-ailant-0ubuntu10.04) lucid; urgency=low
* Apply 1C patch for PostgreSQL (from 8.4.1 version)
- add mchar, fulleq, fasttrun
-- Igor Vershinin <ivershinin@ailant.com.ru> Fri, 04 Jun 2010 00:53:03 +0400
Версию устанавливаем как 18.4.4, чтобы в дальнейшем она самостоятельно не обновилась при апдейте системы. Если будут наши исправления, то всегда возможно скачать новые исходники и повторить с ними операцию, описанную в этой статье, увеличив номер сборки (например, 18.4.4-ailant-1ubuntu10.04).
Следующий файл "control". Необходимо добавить зависимость от библиотеки "libicu42" (требуется для патча от "1С"). В секции "Build-Depends" (в начале файла) в конце списка добавляем ", libicu-dev".
Целиком строка будет выглядеть вот так:
bison, flex, docbook-utils, openjade, docbook, libicu-dev
И последний файл "postgresql-contrib-8.4.install". В него необходимо добавить строки с именами 1С-овских модулей: mchar, fulleq и fasttrun. После строк:
usr/lib/postgresql/8.4/lib/pg_stat_statements.so
usr/lib/postgresql/8.4/lib/citext.so
usr/lib/postgresql/8.4/lib/btree_gin.so
надо добавить:
usr/lib/postgresql/8.4/lib/mchar.so
usr/lib/postgresql/8.4/lib/fulleq.so
usr/lib/postgresql/8.4/lib/fasttrun.so
На этом операцию по адаптации можно считать законченной. У нас получился правильно "патченный", родной для операционной системы исходник. Аналогично можно подготовить версию для любой debian-совместимой ОС.
К сожалению, исправления трех файлов (кроме последнего) нельзя сделать через patch-файл в автоматическом режиме. Патчи применяются уже после того, как скачиваются зависимости и определяется имя пакета.
Готовые патчи и исправленные файлы можно взять также на нашем ftp-сайте ftp://ftp.ailant.com.ru/pub/soft/postgresql-8.4.4-1C-ubuntu/ . Там же в каталоге bin лежит собранный пакет PostgreSQL для Ubuntu 10.04 (x86_64). Это если кому не хочется самостоятельно собирать.
Компиляция может пройти двумя способами. Оба несложных. В первом случае идем "в лоб" и компилируем в рабочей системе, но куча зависимостей будет загружена, что не есть хорошо, для "продакш"-системы. Поэтому воспользуемся пакетом "pbuilder". В этом случае компиляция будет проходить в специально созданном chroot-окружении, и все изменения будут проходить в нем, не трогая рабочую систему. Более подробно об этом можно почитать в https://wiki.ubuntu.com/PbuilderHowto
apt-get install pbuilder cdbs
Все, что ему необходимо, он сам вытянет по зависимостям. Второй пакет необходим для компиляции. Далее:
pbuilder create
Создаем специальное окружение для компиляции. В этот момент много скачивается из репозиториев. У меня с первого раза почему-то не сработало, был сбой и pbuilder закончил работу с ошибкой. Я не стал разбираться отчего это произошло, просто повторно выполнил команду создания.
В дальнейшем рекомендуется перед сборкой давать команду:
pbuilder update
для обновления окружения новыми пакетами.
Переходим в каталог исходников и
pdebuild
Сборка началась. В первый раз по зависимостям будет вытянуто около 500 мегабайт, надо быть к этому готовым. Либо собирать на unlim-канале (дома, например). В дальнейшем пакеты кешируются. У нас используется пакет apt-proxy, который также умеет это делать. Для предприятий, где работает не один сервер, очень рекомендую.
Сборка проходит ровно и спокойно. По окончанию в каталоге "/var/cache/pbuilder/result" будут лежать собранные пакеты.
Продолжаем. Необходимо установить несколько пакетов для поддержки работы PostgreSQL:
apt-get install postgresql-common postgresql-client-common libicu42 libossp-uuid16
Затем, собственно, ставим свежесобранный PostgreSQL:
dpkg -i libpq5_18.4.4-ailant-0ubuntu10.04_amd64.deb
dpkg -i libpgtypes3_18.4.4-ailant-0ubuntu10.04_amd64.deb
dpkg -i postgresql-client-8.4_18.4.4-ailant-0ubuntu10.04_amd64.deb
dpkg -i postgresql-8.4_18.4.4-ailant-0ubuntu10.04_amd64.deb
dpkg -i postgresql-contrib-8.4_18.4.4-ailant-0ubuntu10.04_amd64.deb
Остальные пакеты не нужны для работы "1С:Предприятия 8". В этот момент сервер СУБД будет запущен, также будет проведена первичная инициализация базы данных. Осталось сделать несколько штрихов.
Проверим, чтобы PostgreSQL всегда запускался после перезагрузки:
update-rc.d postgresql-8.4 defaults
Сделаем два симлинка, без которых «1С:Предприятие» не сможет работать с СУБД:
ln -s /usr/lib/locale/en_US.utf8 /usr/lib/locale/en_US
ln -s /usr/share/locale/en /usr/share/locale/en_US
Временно (правда, у меня осталось на постоянно) исправим правила доступа к СУБД. В конфигурационном файле "/etc/postgresql/8.4/main/pg_hba.conf" исправим в строке "host all all 0.0.0.0/0" md5 на trust. На момент начальной отладки так гораздо проще, в дальнейшем (после запуска всей системы) выбирайте сами уровень собственной защиты.
Все PostgreSQL собран и запущен. Устанавливаем "1С:Предприятие". Так как в настоящее время версия 8.2 является основной, то начнем с нее. После установим версию 8.1 для поддержки старых конфигураций (которые еще не перевели на новую платформу).
Переписываем с диска ИТС (скачиваем с сайта 1С) последнюю версию (на момент написания статьи это 8.2.11.229) для архитектуры debian x86_64 (ведь именно этот сервер мы ставили). Копируем на нашем сервере в папку «1С» в домашней директории. Последовательно запускаем:
dpkg -i 1c-enterprise82-common_8.2.11-229_amd64.deb
dpkg -i 1c-enterprise82-server_8.2.11-229_amd64.deb
В принципе, достаточно. Пакеты "-nls" - это языковая поддержка. Нам она не нужна, русский язык есть в основной поставке. Пакет "-ws" - это веб-сервисы. Если нужны, то поставьте. Мне пока без надобности.
После инсталляции надо проверить наличие пользователя user1cv82 в файле /etc/passwd и его домашнего каталога в /home. Именно в нем и будут храниться специфические параметры запуска сервера. Дальше необходимо доставить несколько пакетов:
apt-get install imagemagick msttfcorefonts libgsf-1-114 texlive-binaries
Проверяем все ли библиотеки установлены:
/opt/1c/v8.2/x86_64/utils/config_server
Утилита должна отработать без сообщений. Если написала, что что-то не установлено, надо доставить. Обычно она указывает не на название пакетов, а на недостающие файлы. Узнать в каком они пакете можно через "apt-file search".
Делаем возможность запуска после перезагрузки и запускаем:
update-rc.d srv1cv82 defaults
invoke-rc.d srv1cv82 start
Должно быть "ОК". Если нет, то скорее всего необходимые порты уже заняты. Надо проверить чем. Дальше проверяем, что все процессы запущены нормально:
ps aux | grep 1c
От имени пользователя "usr1cv82" должно быть запущено три процесса: ragent, rmngr и rphost. После имен процессов идут номера портов, на которых они работают. Если процесса не три, а один (такое почему-то иногда бывает, но только при первоначальном запуске), то делаем:
invoke-rc.d srv1cv82 stop
Удаляем каталог ".1cv82" в домашней директории пользователя usr1cv82. И перезапускаем сервер заново. Должно стать все нормально.
Аналогично устанавливаем и сервер "1С:Предприятия 8.1". Но с небольшими изменениями. Во-первых, из-за ошибки скрипта домашний каталог пользователя "usr1cv81" будет установлен неверно, необходимо исправить его, отредактировав "/etc/passwd" и исправив путь на "/home/usr1cv81", по аналогии с пользователем "usr1cv82". Затем создать собственно сам каталог в директории "home" и установить на него владельца "usr1cv81" и группу "grp1cv81". Во-вторых, необходимо исправить порты, на которых будет работать сервер. Редактируем "/etc/init.d/srv1cv81", убирая комментарии со строк и добавляя номера:
SRV1CV8_PORT=11540
SRV1CV8_REGPORT=11541
SRV1CV8_RANGE=11560:11691
т. е. мы использовали порты на 10000 больше, чем порты по умолчанию. Дальше запускаем сервер, проверяем, если надо удаляем директорию ".1cv81" в домашнем каталоге пользователя usr1cv81.
Потом тестовая перезагрузка. Готово. На выделенном сервере работает самостоятельно собранная версия PostgreSQL, а также два сервера "1С:Предприятия" версий 8.1 и 8.2.
Работоспособность проверяется с любой windows-машины, подключением консоли серверов "1С:Предприятия" к нашему серверу на заданный порт (1540 или 11540).
Кстати, при использовании в конфигурациях "1С:Предприятия 8" управляемых блокировок, скорость работы СУБД PostgreSQL в ряде случаев бывает даже выше, чем у MS SQL (под которую изначально и был заточен 1С). Но это все относится к правильной оптимизации запросов, которые в версии 8.2 можно очень гибко настраивать.
И последнее. Несмотря на то, что сейчас все наши сервера работают под Ubuntu, раньше использовалась Fedora. Пример сборки для нее (и похожих дистрибутивов) есть в каталоге ftp://ftp.ailant.com.ru/pub/soft/postgresql-8.3.7-1C-fedora/ . Там лежит как пример готовый spec-файл для сборки. Собирается все через mock (http://fedoraproject.org/wiki/Projects/Mock).
URL:
Обсуждается: http://www.opennet.dev/tips/info/2384.shtml