user icon

LibreOffice Online デモサーバを構築してみた。

Nextcloud との連携編

前回の記事で、loolwsdのインストール・起動までを取り上げましたが、loolwsd単体では、実用性がほぼありません。
そこで、今回は、loolwsdのUIとなるべきフロントエンドとなるNextcloudのインストールと連携を取り上げます。

Nextcloud のインストール

http、PHPの必要モジュール等のインストール

まずはhttpdと必要なモジュールなどをインストールします。

[lool@scw-6b31f8 ~]$ sudo yum install httpd mod_ssl
[lool@scw-6b31f8 ~]$ sudo yum install --enablerepo=epel,webtatic mod_php72w php72w-mbstring php72w-common php72w-mysqlnd php72w-gd php72w-xml php72w-pdo

/etc/httpd/conf/httpd.confの設定

/etc/httpd/conf/httpd.confを編集し、初期設定を行います。
今回は差分を掲載しておきます。

[lool@scw-6b31f8 ~]$ diff -urw /etc/httpd/conf/httpd.conf.orig /etc/httpd/conf/httpd.conf
--- /etc/httpd/conf/httpd.conf.orig     2018-04-11 05:27:26.000000000 +0900
+++ /etc/httpd/conf/httpd.conf  2018-05-28 17:49:27.559577372 +0900
@@ -94,6 +94,15 @@
 #
 #ServerName www.example.com:80

+ServerTokens Prod
+Header unset X-Powered-By
+Header append X-Frame-Options SAMEORIGIN
+Header set X-XSS-Protetion "1; mode=block"
+Header set X-Content-Type-Options nosniff
+RequestHeader unset Proxy
+TraceEnable Off
+ServerSignature Off
+
 #
 # Deny access to the entirety of your server's filesystem. You must
 # explicitly permit access to web content directories in other
@@ -141,14 +150,16 @@
     # http://httpd.apache.org/docs/2.4/mod/core.html#options
     # for more information.
     #
-    Options Indexes FollowSymLinks
+    #Options Indexes FollowSymLinks
+    Options FollowSymLinks

     #
     # AllowOverride controls what directives may be placed in .htaccess files.
     # It can be "All", "None", or any combination of the keywords:
     #   Options FileInfo AuthConfig Limit
     #
-    AllowOverride None
+    #AllowOverride None
+    AllowOverride All

     #
     # Controls who can get stuff from this server.

バーチャルホストの設定

nextcloud,libre,loolの3ホストを利用します。libre,loolに関しては、同一サーバ内で構築する場合は不要かもしれません。(未検証)
今回のデモサーバを構築する前に検証用として構築していたサーバの構成が、Nextcloudサーバとloolwsdサーバが別サーバである
環境であった為、3ホストでの構成となってます。

Nextcloud <->libre(Proxy)<->lool

libreサーバはProxyとして入っています。
Nextcloud内のLibreOfficeとの連携アプリ「Collabora Online」がhttps接続のみしか受け付けない仕様となっていたので、
https(ポート443番)で受けて、loolサーバのポート番号9980番へ中継するという形です。
libreサーバを設けず、loolサーバのポート443番で受けて、loolサーバか、もしくはlocalhostの9980へ中継するという構成の方が妥当かもしれません。さらに言うならば…loolに関しては…loolwsdサーバそのものが通信相手なので、certbotでSSL証明書を更新し続けるためのダミーだったりします。
が、今回は…3ホスト構成という事で…(LB構成を意識したのはナイショです。)

Nextcloudのバーチャルホスト設定

<VirtualHost *:443>
    Servername nextcloud.lancardcom.xyz
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/nextcloud/
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/chain.pem
    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/nextcloud/ssl_access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/nextcloud/ssl_error_log
    <Directory "/var/www/nextcloud/">
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    Servername nextcloud.lancardcom.xyz
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/nextcloud/

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/nextcloud/access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/nextcloud/error_log
    <Directory "/var/www/nextcloud/">
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

libreのバーチャルホスト設定

<VirtualHost *:443>
    Servername libre.lancardcom.xyz
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/libre/
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/letsencrypt/live/libre.lancardcom.xyz/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/libre.lancardcom.xyz/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/libre.lancardcom.xyz/chain.pem
    SSLHonorCipherOrder on

    # Encoded slashes need to be allowed
    AllowEncodedSlashes NoDecode

    # Container uses a unique non-signed certificate
    SSLProxyEngine On
    SSLProxyVerify None
    SSLProxyCheckPeerCN Off
    SSLProxyCheckPeerName Off

    # keep the host
    ProxyPreserveHost On

    # static html, js, images, etc. served from loolwsd
    # loleaflet is the client part of LibreOffice Online
    ProxyPass           /loleaflet https://lool.lancardcom.xyz:9980/loleaflet retry=0
    ProxyPassReverse    /loleaflet https://lool.lancardcom.xyz:9980/loleaflet

    # WOPI discovery URL
    ProxyPass           /hosting/discovery https://lool.lancardcom.xyz:9980/hosting/discovery retry=0
    ProxyPassReverse    /hosting/discovery https://lool.lancardcom.xyz:9980/hosting/discovery

    # Main websocket
    ProxyPassMatch      "lool/(.*)/ws$" wss://lool.lancardcom.xyz:9980/lool/$1/ws nocanon

    # Admin Console websocket
    ProxyPass           /lool/adminws wss://lool.lancardcom.xyz:9980/lool/adminws

    # Download as, Fullscreen prezentation and Image upload operations
    ProxyPass           /lool https://lool.lancardcom.xyz:9980/lool
    ProxyPassReverse    /lool https://lool.lancardcom.xyz:9980/lool


    Loglevel debug
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/libre/ssl_access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/libre/ssl_error_log

    #Header always set Content-Security-Policy "default-src 'none'"

    <Directory "/var/www/libre/">
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>
                                                                                                                        <VirtualHost *:80>
    Servername libre.lancardcom.xyz
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/libre/
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/libre/access_log_%Y%m%d 86400 540" combined

    <Directory "/var/www/libre/">
       AllowOverride All
       Options FollowSymLinks
    </Directory>
</VirtualHost>

loolのバーチャルホスト設定

このバーチャルホストはLet’s EncryptでSSL証明書を取るためのダミーだったりします。
オレオレ証明書で起動した際、Nextcloudとの連携時に不具合が出た為、正規のSSL証明書で運用する事になりました。

<VirtualHost *:80>
    Servername lool.lancardcom.xyz
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/lool/
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/lool/access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/lool/error_log
    <Directory "/var/www/lool/">
       AllowOverride All
       Options FollowSymLinks
    </Directory>
</VirtualHost>

loolwsd 側の設定

連携時に必要なloolwsd側の設定です。
online/loolwsd.xmlにて設定します。
今回は差分を掲載しておきます。
設定の要はSSL証明書の格納場所と通信許可ホストとWOPIホストの設定です。

--- loolwsd.xml.orig    2018-06-04 09:59:41.709736164 +0900
+++ loolwsd.xml 2018-06-07 10:49:16.111249275 +0900
@@ -3,7 +3,7 @@
     <!-- Note: 'default' attributes are used to document a setting's default value as well as to use as fallback. -->
     <!-- Note: When adding a new entry, a default must be set in WSD in case the entry is missing upon deployment. -->

-    <allowed_languages desc="List of supported languages on this instance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages>
+    <allowed_languages desc="List of supported languages on this instance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">ja de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages>

     <tile_cache_path desc="Path to a directory where to keep the tile cache." type="path" relative="false" default="/usr/local/var/cache/loolwsd"></tile_cache_path>
     <sys_template_path desc="Path to a template tree with shared libraries etc to be used as source for chroot jails for child processes." type="path" relative="true" default="systemplate"></sys_template_path>
@@ -39,7 +39,7 @@
         <color type="bool">true</color>
         <level type="string" desc="Can be 0-8, or none (turns off logging), fatal, critical, error, warning, notice, information, debug, trace" default="trace">trace</level>
         <file enable="true">
-            <property name="path" desc="Log file path.">/tmp/loolwsd.log</property>
+            <property name="path" desc="Log file path.">/opt/lool/loolwsd.log</property>
             <property name="rotation" desc="Log file rotation strategy. See Poco FileChannel.">never</property>
             <property name="archive" desc="Append either timestamp or number to the archived log filename.">timestamp</property>
             <property name="compress" desc="Enable/disable log file compression.">true</property>
@@ -65,16 +65,19 @@
     <net desc="Network settings">
       <proto type="string" default="all" desc="Protocol to use IPv4, IPv6 or all for both">all</proto>
       <post_allow desc="Allow/deny client IP address for POST(REST)." allow="true">
-        <host desc="Regex pattern of ip address to allow.">192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host>
+        <host desc="Regex pattern of ip address to allow.">localhost</host>
+        <host desc="Regex pattern of ip address to allow.">nextcloud.lancardcom.xyz</host>
+        <host desc="Regex pattern of ip address to allow.">libre.lancardcom.xyz</host>
+        <host desc="Regex pattern of ip address to allow.">lool.lancardcom.xyz</host>
       </post_allow>
     </net>

     <ssl desc="SSL settings">
         <enable type="bool" default="true">true</enable>
         <termination desc="Connection via proxy where loolwsd acts as working via https, but actually uses http." type="bool" default="true">false</termination>
-        <cert_file_path desc="Path to the cert file" relative="false">/etc/loolwsd/cert.pem</cert_file_path>
-        <key_file_path desc="Path to the key file" relative="false">/etc/loolwsd/key.pem</key_file_path>
-        <ca_file_path desc="Path to the ca file" relative="false">/etc/loolwsd/ca-chain.cert.pem</ca_file_path>
+        <cert_file_path desc="Path to the cert file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/cert.pem</cert_file_path>
+        <key_file_path desc="Path to the key file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/privkey.pem</key_file_path>
+        <ca_file_path desc="Path to the ca file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/chain.pem</ca_file_path>
         <cipher_list desc="List of OpenSSL ciphers to accept" default="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"></cipher_list>
         <hpkp desc="Enable HTTP Public key pinning" enable="false" report_only="false">
             <max_age desc="HPKP's max-age directive - time in seconds browser should remember the pins" enable="true">1000</max_age>
@@ -94,6 +97,9 @@
         <filesystem allow="false" />
         <wopi desc="Allow/deny wopi storage. Mutually exclusive with webdav." allow="true">
             <host desc="Regex pattern of hostname to allow or deny." allow="true">localhost</host>
+            <host desc="Regex pattern of hostname to allow or deny." allow="true">nextcloud.lancardcom.xyz</host>
+            <host desc="Regex pattern of hostname to allow or deny." allow="true">libre.lancardcom.xyz</host>
+            <host desc="Regex pattern of hostname to allow or deny." allow="true">lool.lancardcom.xyz</host>
             <host desc="Regex pattern of hostname to allow or deny." allow="true">10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}</host>
             <host desc="Regex pattern of hostname to allow or deny." allow="true">172\.1[6789]\.[0-9]{1,3}\.[0-9]{1,3}</host>
             <host desc="Regex pattern of hostname to allow or deny." allow="true">172\.2[0-9]\.[0-9]{1,3}\.[0-9]{1,3}</host>

httpd、loolwsdサービスの再起動

httpdとloolwsdを再起動して、これまでの設定を有効化します。
エラーが出る場合は、設定の見直しや必要なディレクトリやパーミッションの設定など調整してください。
例)構築中に実際にあったエラー原因
* ログ用のディレクトリを未作成、もしくはオーナー、パーミッションの設定間違い
* SSL証明書のディレクトリのパーミッション設定(700でroot以外読めなかった)
* ドキュメントルートのディレクトリを未作成
* 単純なconfファイルのタイポ

Nextcloudのインストール

ここまで長かったですが…やっとNextcloud本体のインストールです。
まぁ、ソースダウンロードして、ドキュメントルートにおいて、あとは、WebUIの指示に従ってインストールするだけなので、ほぼこれまでの準備が肝だったり。あ…Nextcloud用のDBの準備忘れてました。

Nextcloud用DBの作成

[root@scw-6b31f8 ~]# mysql -u root -p
Enter password:
elcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE データベース名;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON データベース名.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード' ;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> FLUSH PRIVILEGES ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> QUIT
Bye

Nextcloudのソースのダウンロードと配置

[lool@scw-6b31f8 Archives]$ wget https://download.nextcloud.com/server/releases/nextcloud-13.0.2.zip
[lool@scw-6b31f8 Archives]$ unzip nextcloud-13.0.2.zip
[lool@scw-6b31f8 Archives]$ sudo cp -rp nextcloud/* /var/www/nextcloud/
[lool@scw-6b31f8 Archives]$ sudo chown -R apache. /var/www/nextcloud
[lool@scw-6b31f8 Archives]$ sudo systemctl restart httpd

後は、ブラウザで、Nextcloud用に設定したURLを開いて、画面の指示に従ってインストールを完了させます。
もしWebUIでのインストールがわからない…という方は…ドキュメントを読み直してください。
(すみません。画像貼るのが面倒なので手抜きさせてください。)
こちらのサイトなどを参照していただけると丁寧に解説されてます。
CentOS7にNextcloudインストール | server-memo.net
CentOS 7 : NextCloud インストール : Server World

Nexcloud側の連携設定

最後に、NexcloudのWebUI上の「アプリ」から「Collabora Online」を有効にします。
すると、「設定」の左サイドメニューに「Collabora Online」の項目が表示されますので、そこで、loolwsdサーバを指定します。
今回の場合は…Proxyであるlibreを指定するので、「https://」から始まるアドレスを入力して「適用」をクリックして完了です。
おそらくここまでの記事で設定を進めてこれた方であれば、見ればわかるので、スクリーンショットなど付けた説明は割愛させていただきます。
(さらにリンクを貼るのも手抜きさせてください。)

最後に構築後、操作してみた感じ

実際に、操作してみた感じですが、やはり…入力、変換等は通信ラグ等により、もっさり感がぬぐえません。まだ完全にLibreOfficeの全機能に対応してはいない為、メニューにはあるのに機能しない部分もちらほらありました。loolwsdのログを見て気が付いたのですが、なぜかUTC表示からローカル時刻への変更ができません。
上記の現象と同一の原因だと思われますがCalc(表計算)のNOW()関数などの結果もUTCで表示される為、その辺が難点になるかと思われます。
やはり…Microsoft Office365やGoogleAppsなどの大手商用サービスと比較すると、ユーザビリティに一歩劣る感は否めませんでした。

ただし…
– どうしてもデータをクラウド上に置けない。オンプレミスである必要がある。
->(社内規定などによるセキュリティ上の制限がある。)
– 内部での共有のみで、外部とのドキュメント等のやり取りをほぼ行わない。
->(MicrosoftのWard、Excelファイル等と互換はありますが、それほど互換性は高くないです。)
– ライセンスにコストをかけたくない
->(オープンソースなので構築コスト・保守コスト以外はかかりません。)
と言った場合には最適のソリューションではないでしょうか。

Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)