В статье Настройка Jabber-сервера Prosody с аутентификацией пользователей через Dovecot SASL я описал настройку BOSH. BOSH расшифровывается как Bidirectional-streams Over Synchronous HTTP - двунаправленные потоки данных через синхронный HTTP. Этот протокол позволяет клиентам Jabber взаимодействовать с сервером Jabber через протокол HTTP. Особенно полезной эта функция оказывается для веб-клиентов Jabber, одним из которых и является программа Jappix. Кроме того, что название этой программы похоже на название системы мониторинга Zabbix, можно сказать разве лишь следующее:
Последний пункт был ещё не настолько очевиден в октябре 2017 года, когда я, по сути, и готовил эту статью.
Т.к. веб-приложения нет в репозиториях Debian, я подготовил скрипт для сборки deb-пакета:
#!/bin/sh wget --quiet wget https://github.com/jappix/jappix/archive/master.zip -O jappix-master.zip unzip -q jappix-master.zip rm jappix-master.zip PACKAGE=jappix DATETIME=`date "+%Y%m%d%H%M%S"` VERSION="0.$DATETIME" DIR=${PACKAGE}_${VERSION} mkdir -p $DIR/DEBIAN # Формируем описание пакета cat - > $DIR/DEBIAN/control <<END Package: $PACKAGE Version: $VERSION Architecture: all Depends: apache2 | httpd, php, php-common (>= 5.5.0+dfsg-10~), php-curl, php-gd Maintainer: Vladimir Stupin <vladimir@stupin.su> Description: Jappix, a full-featured XMPP web-client Jappix, a full-featured XMPP web-client Homepage: https://github.com/jappix/jappix END chmod 755 $DIR/DEBIAN/control cat - > $DIR/DEBIAN/postinst <<END #!/bin/sh # postinst script for jappix set -e # summary of how this script can be called: # * <postinst> \`configure' <most-recently-configured-version> # * <old-postinst> \`abort-upgrade' <new version> # * <conflictor's-postinst> \`abort-remove' \`in-favour' <package> # <new-version> # * <deconfigured's-postinst> \`abort-deconfigure' \`in-favour' # <failed-install-package> <version> \`removing' # <conflicting-package> <version> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "\$1" in configure) # Change permissions to etc files if ! dpkg-statoverride --list /etc/tmpfiles.d/jappix.conf >/dev/null; then chown -R root:root /etc/tmpfiles.d/jappix.conf chmod 644 /etc/tmpfiles.d/jappix.conf fi # Change permissions to application files if ! dpkg-statoverride --list /usr/share/jappix >/dev/null; then chown -R root:root /usr/share/jappix chmod 755 /usr/share/jappix find /usr/share/jappix -type d | xargs chmod 755 find /usr/share/jappix -type f | xargs chmod 644 fi # Create data directory if [ ! -d "/var/lib/jappix" ]; then install -d -o www-data -g www-data -m 770 /var/lib/jappix; fi if ! dpkg-statoverride --list /var/lib/jappix >/dev/null; then chown -R www-data:www-data /var/lib/jappix chmod 770 /var/lib/jappix find /var/lib/jappix -type d | xargs chmod 770 find /var/lib/jappix -type f | xargs chmod 660 fi # Create logs directory if [ ! -d "/var/log/jappix" ]; then install -d -o www-data -g www-data -m 770 /var/log/jappix; fi # Create tmp directory systemd-tmpfiles --create >/dev/null 2>&1 ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \\\`\$1'" >&2 exit 1 ;; esac END chmod 0755 $DIR/DEBIAN/postinst # Формируем содержимое пакета mkdir -p $DIR/usr/share/jappix/ cp -R jappix-master/* $DIR/usr/share/jappix/ rm -R jappix-master # Выносим каталог /usr/share/jappix/store в /var/lib/jappix mkdir -p $DIR/var/lib/ mv $DIR/usr/share/jappix/store $DIR/var/lib/jappix ln -s /var/lib/jappix $DIR/usr/share/jappix/store # Выносим каталог /usr/share/jappix/tmp в /tmp/jappix rm -R $DIR/usr/share/jappix/tmp ln -s /tmp/jappix $DIR/usr/share/jappix/tmp mkdir -p $DIR/etc/tmpfiles.d/ cat - > $DIR/etc/tmpfiles.d/jappix.conf <<END d /tmp/jappix/ 0770 www-data www-data 10m - d /tmp/jappix/avatar/ 0770 www-data www-data 10m - d /tmp/jappix/archives/ 0770 www-data www-data 10m - d /tmp/jappix/send/ 0770 www-data www-data 10m - d /tmp/jappix/cache/ 0770 www-data www-data 10m - END # Выносим каталог /usr/share/jappix/log в /var/log/jappix rm -R $DIR/usr/share/jappix/log ln -s /var/log/jappix $DIR/usr/share/jappix/log FILE=${PACKAGE}_${VERSION}_all.deb # Формируем пакет dpkg-deb -b $DIR $FILE >/dev/null 2>&1 rm -R $DIR
Сохраним этот скрипт под именем make_jappix.sh, сделаем его исполняемым и запустим:
$ chown +x ./make_jappix.sh $ ./make_jappix.sh
Если всё пройдёт успешно, то в текущем каталоге появится deb-файл. Во время подготовки статьи к публикации собранный мной deb-файл назывался jappix_0.20190321184054_all.deb. Установим его в систему:
# dpkg -i /home/stupin/jappix_0.20190321184054_all.deb
Если в системе не установлены необходимые зависимости для этого пакета, то исправить это можно, установив недостающие пакеты вручную и завершив установку недостающих зависимостей при помощи пары команд:
# apt-get install nginx-full php-fpm # apt-get install -f
Настройка BOSH уже была описана, поэтому не буду повторяться и приступлю сразу к настройке приложения Jappix. Во-первых, если у вас ещё не настроен пул процессов PHP-FPM, то можно настроить его, создав файл в каталоге /etc/php/7.0/fpm/pool.d/. Я создал файл /etc/php/7.0/fpm/pool.d/www07.conf со следующим содержимым:
[www07] user = www07 group = www-data listen = /var/run/www07.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 ;chroot = /home/www07/ chdir = /usr/share/jappix/ pm = ondemand pm.max_children = 2 pm.process_idle_timeout = 10m ;access.log = /var/log/php5-fpm.access.log php_flag[log_errors] = On ;php_value[error_log] = /var/log/php5-fpm.error.log php_value[error_reporting] = E_ALL & ~E_NOTICE php_value[post_max_size] = 8M php_value[upload_max_filesize] = 8M php_value[date.timezone] = Asia/Yekaterinburg
Теперь нужно перезагрузить php-fpm, чтобы настройки нового пула процессов вступили в силу:
# systemctl reload php7.0-fpm.service
Теперь можно приступить к настройке nginx. Я вписал в файл /etc/nginx/sites-enabled/default в секцию server следующие настройки:
location /jappix/ { alias /usr/share/jappix/; index index.php; } location ~ ^/jappix/.+\.php$ { root /usr/share/jappix/; include fastcgi.conf; fastcgi_pass unix:/var/run/www07.sock; fastcgi_split_path_info ^/jappix(/.+\.php)(.*)$; } location ~ /jappix/(app|i18n|log|test|tmp|tools)/ { deny all; }
Осталось перезагрузить nginx, чтобы он узнал о новых настройках:
# systemctl reload nginx.service
Теперь можно вооружиться браузером и приступить к настройке только что установленного приложения.
Начальная настройка Jappix:
Внимание! В примере ниже включена опция шифрования. Подумайте о том, стоит ли включать её. Во-первых, при использовании HTTPS, требование шифрования избыточно, т.к. шифрование уже осуществляется на уровне сеанса HTTPS. Во-вторых - требование шифрования может вызвать проблемы, т.к. со стороны сервера может быть выставлена настройка, запрещающая устанавливать шифрованные соединения через HTTPS. В частности, клиент Pidgin с графическим интерфейсом, при указании адреса BOSH пытается установить шифрованное подключение по протоколу XMPP через уже зашифрованное подключение HTTPS. Поскольку в Pidgin нет опции для безусловного отключения требования шифрования, то заставить его работать через BOSH не удаётся. Если вы всё-же включили шифрование, то отключить его позже можно через файл /var/lib/jappix/conf/main.xml, для этого нужно вписать значение off в строчку "<encryption>on</encryption>" и сохранить изменения.
Вход в Jappix:
Настройка профиля пользователя Jappix:
На снимке ниже программа предлагает создать публичный профиль на сайте, который уже не существует. Стоит отказаться от предложения. На мой взгляд, не стоило бы соглашаться, даже если сайт по-прежнему работал бы.
Окно программы:
Вход в комнату:
Поиск пользователя в каталоге VJUD - Virtual Jabber User Directory:
Включить/отключить возможность поиска своей учётной записи в каталоге VJUD:
Поскольку через VJUD мне ни разу не удалось найти что-либо, возможно поддержка VJUD в Prosody, описанная в прошлой статье, просто сломана.
Учётная запись из примеров - экспериментальная. Не стоит писать мне сообщения на неё, т.к. я пока не пользуюсь ей активно и она в любой момент может оказаться неисправной вместе с сервером Jabber. Лучше пишите комментарии или письма.
Если кто-то может подсказать альтернативные веб-клиенты Jabber, которые продолжают активно поддерживаться, и поделиться опытом их использования, прошу написать в комментарии.