NextCloud + Collabora

NextCloud と Collabora Office を連携させると複数人で同時に(共有リンク経由でも) LibreOffice ファイルを編集できて便利そうなので入れて見みました。なんだか色々ややこしかったというかハマりどころが多かったのでメモです。

NextCloud 設定

NextCloud 自体は、よくある設定のまま。細部は違えど、 Nginx Configuration — Nextcloud 11 Server Administration Manual 11 alpha documentation に書かれたままでよく、はまりどころも少ない。

NextCloud と Collabora を連携させるにあたって、セキュリティ上の理由で別のサブドメインで運用することが推奨されていた気がするが、ソースが見当たらない(あと、なぜか今 https://nextcloud.com/collaboraonline/ につながらない)。

Colabolla Online Development Edition 設定

Collabora に関しては、基本は先ほどのページの内容で実施するが、いくつか修正が必要だった。

まず、以前 VPS でやってうまくいかなかった経験から、一度 LAN 内のサーバでオレオレ鍵で試していたが、これだと権限がない旨が出力された。https://help.nextcloud.com/t/libreoffice-nextcloud-access-forbidden-issue/6358/17 に書かれているように、 NextCloud から Collabora に繋ぎに行くときに SSL 証明書を検証するのに失敗したときもこのエラーが出るらしく、オレオレ証明書を使う場合は (NextCloud のディレクトリ)/resources/config/ca-bundle.crt に自分が使う証明書を追記する必要があった。

続いて、つなぐと Collabora の画面が真っ白で止まった。nginx 側の設定を NextCloud のものからコピーしたが、そこに

add_header X-Frame-Options "SAMEORIGIN";

が含まれていたので削除した。(追記:削除する意味は各自で考えること!安全ではないように思えるので再検討中)

続いて、

wsd-00024-00033 15:52:08.397614 [ websrv_poll ] ERR  #20 Exception while processing incoming request: [GET /lool/https%3A%2F%2F(略) H...]: Invalid or unknown request.| wsd/LOOLWSD.cpp:1665

みたいなエラーが出た。Collabora: Invalid or unknown request – support / collabora – Nextcloud community に書かれている通り、 nginx 側の、 Collabora で使うドメインで

chunked_transfer_encoding off;

を追記すると動いた。

最終的に、Collabora 側の nginx の設定は、

server {
        #listen 80 default_server;
        #listen [::]:80 default_server;
        listen 443 ssl;
        listen [::]:443 ssl;

        ssl_certificate /etc/nginx/ssl/**;
        ssl_certificate_key /etc/nginx/ssl/**;

        chunked_transfer_encoding off;

        server_name ***;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;

        proxy_buffering off;

        location ^~ /loleaflet {
                proxy_pass https://localhost:9980;
                proxy_set_header Host $http_host;
        }

        location ^~ /hosting/discovery {
                proxy_pass https://localhost:9980;
                proxy_set_header Host $http_host;
        }

        location ^~ /lool {
                proxy_pass https://localhost:9980;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $http_host;
        }

}

という感じになった。(検証環境のものなので、 TLS 自体の設定はかなり手抜きになっている)

あとは以前試した時は繋ぐと Connecting で 1 分ぐらい待たされたりタイムアウトしたりする現象があったが、最新の CODE 2.1 を入れたところ解消したようだ。