Установка Openmeetings 1.9.1 на FreeBSD 9, шаг за шагом.

FreeBSD
Возникла необходимость организации видеоконференций, причем основным условием было отсутствие на стороне клиента необходимости установки дополнительного ПО. После коротких поисков в сети было найдено приемлемое решение Openmeetings.
На данный момент актуальная версия openmeetings_1_9_1_r4707, её и будем ставить.

Как понятно из заголовка ставить будем на FreeBSD 9, в сети есть несколько статей по установке но все они или не полны или относятся к устаревшим версиям. Система свеже установлена, первичная настройка произведена (сеть, обновление портов и т.п.) — эту часть расписывать не буду в сети мануалов хватает. Переходим собственно к установке, для начала надо установить весь необходимый дополнительный софт.
Начинаем с установки openoffice.org-3, лирическое отступление, последовательность установки подобрана по ходу десятка экспериментов и я даю её в том виде в котором она вызывает меньше всего проблем.
Здесь мы конфигурируем ОпенОфис и его зависимости затем пытаемся скачать все необходимые исходники.
Процесс сборки офиса совсем не быстрый и этим хинтом мы экономим себе время.
valg# cd /usr/ports/editors/openoffice.org-3
valg# make config-recursive fetch-recursive

На скачивании исходников для openJDK все валиться с ошибкой и просьбой скачать часть архивов руками — скачиваем кладем в
/usr/ports/distfile

запускаем по новой но уже без конфигурирования
valg# cd /usr/ports/editors/openoffice.org-3
valg# make fetch-recursive install clean

На этом моменте у нас появляется куча свободного времени — на двухпроцессорном сервере офис собирался около 12 часов.
После установки проверяем запуск офиса в режиме демона
valg# /usr/local/openoffice.org-3.3.0/openoffice.org3/program/soffice.bin -headless -nofirststartwizard -accept="socket,host=localhost,port=8100;urp;StarOffice.Service"

Если все нормально то в выводе
valg# sockstat

мы увидим нечто подобное

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
root     soffice.bi 53172 5  stream /tmp/OSL_PIPE_0_SingleOfficeIPC_44e0c34da8623980ccf9f8299a62e4fb
root     soffice.bi 53172 15 tcp4   127.0.0.1:8100        *:*
root     soffice.bi 53172 16 tcp4   *:*                   *:*

Если же ничего подобного нет, значит что-то пошло не так, и надо гуглить на тему запуска офиса как демона.
Следующий шаг установка JDK16
valg# cd /usr/ports/java/jdk16
valg# make fetch-recursive

Здесь нам тоже придется скачать кучу пакетов руками, в общем внимательно читаем что нам пишет вывод make.
valg# make install clean

Далее ставим и настраиваем MYSQL
valg# cd /usr/ports/databases/mysql51-server/
valg# make install clean
valg# cd /usr/ports/databases/mysql51-scripts/
valg# make install clean
valg# echo 'mysql_enable="YES"' >> /etc/rc.conf
valg# cp /usr/local/share/mysql/my-medium.cnf /var/db/mysql/my.cnf

В файле my.cnf надо добавить следующие строчки в соответствующие секции
[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

[mysql]
default-character-set=utf8

ну и далее стартуем сервер и запускаем постинсталяционный скрипт

valg# service mysql-server start
valg# /usr/local/bin/mysql_secure_installation 

Тут есть два пути, первый — ничего больше не настраивать, а в дальнейшем в настройках openmeetings указать пароль root для MYSQL и openmeetings сам создаст необходимые ему базы и таблицы, довольно спорный с точки зрения безопасности путь.
И второй — создать все самим. На всякий случай для него команды я тоже приведу
valg# mysql -p
mysql> CREATE USER 'openmeetings'@'localhost'
 IDENTIFIED BY 'secret_password';
mysql> GRANT USAGE ON *.* TO 'openmeetings'@'localhost'
 IDENTIFIED BY 'secret_password';
mysql> CREATE DATABASE IF NOT EXISTS `openmeetings`;
mysql> GRANT ALL PRIVILEGES ON `openmeetings`.*
 TO 'openmeetings'@'localhost';

как-то так.
Теперь ставим все что нужно для конвертирования документов:

 valg# cd /usr/ports/graphics/swftools
 valg# make install clean
 valg# cd /usr/ports/graphics/ImageMagick
 valg# make install clean
 valg# cd /usr/ports/multimedia/ffmpeg
 valg# make install clean
 valg# cd /usr/ports/audio/sox
 valg# make install clean


Описанное выше в общих чертах есть в вики по Openmeetings, сейчас переходим к тому чего в вики нет.
Openmeetings писался явно под Linux и из-за этого во FreeBSD возникают многочисленные мелкие и не очень проблемы.
Первая проблема — пути, хотя на первый взгляд используются относительные пути и даже местами можно их подредактировать, но только местами часть путей жестко прописана в коде и со структурой каталогов FreeBSD не срастается.
Решение — устанавливать Openmeetings в каталог
/usr/local/opt

Вторая проблема — использование bash, в общем не большая проблема легко решаемая
valg# cd /usr/ports/shells/bash
valg# make install clean
valg# cp /usr/local/bin/bash /usr/bin/ 

вместо последней строчки можно сделать симлинк.
Третья проблема — UTF-8! И это уже проблема самой FreeBSD, выражается она в нечитаемости русского текста в конвертированных документах и заголовках приглашений (возможно еще где-то вылазит, но эти два места особенно критичны). Причина в том что конвертирование производиться консольными утилитами, а консоль у нас UTF-8 совсем не умеет, по крайней мере в части русского языка. Решение — использовать костыль в виде jfbterm это программа позволяет в консоли отображать юникод, правда со вводом на русском в консоли все совсем плохо.
valg# cd /usr/ports/sysutils/jfbterm
valg# make -DBATCH install clean
valg# cap_mkdb /usr/share/misc/termcap

Далее файле /usr/local/etc/jfbterm.conf ищем строчку:
encoding: locale

меняем на
encoding: UTF-8

потом ищем
# UTF-8
#encoding.UTF-8: UTF-8,iso10646.1

убираем коментарий со строчки
encoding.UTF-8: UTF-8,iso10646.1

после этого из консоли
valg# setenv LANG ru_RU.UTF-8
valg# jfbterm

теперь можно работать с юникодом в консоли, это было описание костыля, далее я еще вернусь к этому моменту.
Забегая вперед для тех кто решит экспериментировать с ночными сборками openmeetings 2.0.0 (живет здесь ) рассказываю о еще двух моментах.
Первый, для конвертации документов там используется jodconverter-core-3.0-beta-4 живет здесь и лежать содержимое архива по ссылке выше должно в
/usr/local/opt/red5/webapps/openmeetings/jodconverter-core-3.0-beta-4

Второе вылазит из первого, те-же жестко прописанные в коде jodconverter пути, а именно, он ищет опенофис в каталоге
/opt/openoffice.org3
решение простое создаем каталог /opt в корневой директории и делаем симлинк
valg# ln -s /usr/local/openoffice.org-3.3.0/openoffice.org3 /opt


Ну вроде все необходимое установили, подводные камни разобрали, переходим собственно к установке Openmeetings.
Идем сюда и забираем архив. Содержимое архива, а именно каталог red5 распаковываем в
/usr/local/opt

ниже путь и листинг того что должно получиться
valg# ls /usr/local/opt/red5
boot.jar                license.txt             red5-debug.bat          red5-highperf.sh        red5.bat                webapps
conf                    log                     red5-debug.sh           red5-shutdown.bat       red5.jar                work
lib                     plugins                 red5-highperf.bat       red5-shutdown.sh        red5.sh

поскольку паковали архив явно под виндой права на исполнение со скриптов послетали, это нужно исправить.
valg# chmod 7444 red5.sh
valg# chmod 7444 red5-shutdown.sh
valg# chmod 7444 red5-debug.sh
valg# chmod 7444 red5-highperf.sh

Далее правим настройки Openmeetings
valg# cd /usr/local/opt/red5/webapps/openmeetings/WEB-INF/classes/META-INF/
valg# cp persistence.xml persistence.xml.old
valg# cp mysql_persistence.xml persistence.xml 

В файле persistence.xml прописываем пароль рута от MYSQL (я описываю простой вариант). В поле «Password» вместо ROOTPASSWORD вписываем пароль который установили руту в MYSQL.
<property name="openjpa.ConnectionProperties"
                                        value="DriverClassName=com.mysql.jdbc.Driver
                                                , Url=jdbc:mysql://localhost:3306/openmeetings?autoReconnect=true&useUnicode=true&createDatabaseIfNotExist=true&characterEncoding=utf-8&connectionCollation=utf8_general_ci&cachePrepStmts=true&cacheCallableStatements=true&cacheServerConfiguration=true&useLocalSessionState=true&elideSetAutoCommits=true&alwaysSendSetIsolation=false&enableQueryTimeouts=false&prepStmtCacheSize=3000&prepStmtCacheSqlLimit=1000
                                                , MaxActive=100
                                                , MaxWait=10000
                                                , TestOnBorrow=true
                                                , poolPreparedStatements=true
                                                , Username=root
                                                , Password=ROOTPASSWORD"/>

По большому счету на этом все настройки и заканчиваются — можно пробовать запускать.
Для этого логинимся в консоль и делаем следующие:
valg# setenv LANG ru_RU.UTF-8
valg# jfbterm
valg# cd /usr/local/opt/red5
valg# ./red5.sh

Выжидаем минуты две и из другой консоли проверяем что у нас получилось.
valg# sockstat

В выводе должны быть следующие строчки:
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
root     java       53043 69 tcp4   *:9999                *:*
root     java       53043 127 tcp4  *:1935                *:*
root     java       53043 272 tcp4  *:5080                *:*
root     java       53043 274 tcp4  *:8088                *:*

Если они есть переходим к следующему этапу, если нет то ждем еще пару минут red5 не очень быстро запускается, если ничего так и не появилось — идем читать логи и гуглить.
В своем любимом браузере набираем
http://IP_сервера:5080/openmeetings/install 
и попадаем на страничку первоначальной настройки. Соглашаемся приступить к Step 1 и дальше просто заполняем необходимые поля, по окончании нажимаем Install внизу странички и ждем несколько минут, пока не появиться приглашение войти в программу — можно кликнуть по ссылке, а можно просто в браузере набрать
http://IP_сервера:5080/openmeetings/

Для работы серверу требуються TCP порты 1935, 5080, 8088.
Работает Openmeetings вполне стабильно, нареканий пока особо не было. Из крупных минусов не хочет воспринимать документы с расширением .TXT как это вылечить способа я не нашел. С версией 2.0.0 таких проблем нет, зато есть куча других :)
Собственно все, на этом установка закончена. Остается решить проблему с автозапуском всего этого хозяйства при перезагрузке и придумать как это все запускать от не привелегированного пользователя. Поскольку у нас сервер запускается по требованию эти проблемы не сильно актуальны, но решать их все таки надо. Буду благодарен если кто подскажет решение.

Надеюсь кому нибудь эта сумбурная статья поможет.

28 комментариев

avatar
Минимально скрипт должен быть такой, обзовем его openmstart.sh:
#!/usr/local/bin/bash
# при необходимости прописываем зависимости, что должно стартовать до скирпта, вместе и так далее, см PS ниже
case "$1" in
    start)
        setenv LANG ru_RU.UTF-8
        {полный путь}/jfbterm &
        /usr/local/opt/red5/red.sh
    ;;

    stop)
    killall -KILL java <- вообще лучше убивать конкретный pid-файл через rm - процесс корректней умирает
    killall -KILL jfbterm
    ;;
*)
echo "Для запуска укажите параметр: `basename $0` {start|stop}" >&2
        exit 64
        ;;
        esac
        exit 0

Кладем сей скрипт в /etc/rc.d или /usr/local/etc/rc.d, в rc.conf добавляем
openmstart_enable="Yes"
и наберем в командной строке /etc/rc.d/openmstart.sh start или /usr/local/etc/rc.d/openmstart.sh start. Если все сделали правильно получим поднятый openmeeting. Соответственно при ребуте получите взлетевший сервис.

PS(из гугла): Каждый скрипт из /etc/rc.d для утилиты rcorder должен содержать специальные строчки, особенно строчку с словом «PROVIDE:» обязательную строчку "# KEYWORD: FreeBSD" и если необходимо, то строчки со словами «REQUIRE:» и «BEFORE:». Строчки должны располагаться в виде блока (одна за другой). Формат строчек строго заданный. Каждая специальная строчка должна начинаться с символа '#' за которым следует один символ 'пробел' далее одно из слов PROVIDE:, REQUIRE:, BEFORE:, KEYWORD:, затем снова символ 'пробел' и заканчивается все «обстоятельствами» (conditions).

# PROVIDE: Задает имя сервиса (демона), которое обслуживает этот скрипт.
# REQUIRE: Список сервисов (демонов|обстоятельств), необходимых этому скрипту для запуска своего демона (сервиса).
# BEFORE: Список сервисов (демонов|обстоятельств), зависящих от демона запускаемого этим скриптом.
# KEYWORD: FreeBSD или NetBSD, также в этой строчке можно написать волшебное слово «nostart» тогда rcorder исключит этот скрипт из своего списка.
avatar
Спасибо!
Я нечто подобное как раз и собирался заваять.
avatar
творческих как говориться…
комментарий был удален
avatar
OpenMeetings работает без особых проблем, единственное, запись работает по-странному. Если в конференции находится один человек, то запись, проходит нормально, потом ее можно просмотреть. Если в комнате два или более человек, то в записях она появляется, но проиграть ее невозможно. Никто не сталкивался?
avatar
не видел такого, посмотри что в логах — на предмет работы sox и ffmpeg — какая-то ошибка при муксинге видеопотоков в единое целое
avatar
Версия OM у меня такая же, хотел узнать по-поводу остального:
sox-14.3.2
ffmpeg-0.6.3
А какие версии у Вас?
avatar
у меня никакие, в гугле был совет — проверить поднять уровень логирования и посмотреть что пишет насчет работы этих программ
avatar
Все, разобрался, нужно было обновить версии sox и ffmpeg. Теперь все работает.
avatar
вот и славненько