Nextcloud と Collabora Online の連携
Microsoft 365 的なドキュメントサーバー環境を作れるという話を聞いて、Debian12(bookworm)サーバーに、Nextcloud と Collabora Online(LibreOffice Online) を設定してみます。
Nextcloud
Nextcloudはブラウザ経由でファイルを管理するためのアプリです。
これをベースにして、ブラウザ上でMS Officeライクなドキュメントや、表計算ができる Collabora Onlne を連携させます。
インストール方法はいろいろあるようですが、Nextcloudのサーバー COMMUNITY PROJECTSより Zip file を選択して、展開して配置しました。執筆時点のバージョンは 28.0.1 となっていました。
アプリケーションの依存を解決します。
Nextcoloudではソースを展開するためのunzipをはじめ、apache2、mariadb、php(gd,json,curl,mbstring,mysql,intl,imagick,xmls,zip)等が必要になります。
ここではすべて、APTでインストール可能な最新バージョンを採用しましたが、利用する Nextcloud のバージョンとの互換性も確認した上で選択してください。
php8.2-json は libapache2-mod-php8.2 等で提供されるバーチャルパッケージだそうなので、libapache2-mod-php8.2 を採用します。
メタパッケージとバーチャルパッケージの違いが筆者自身あいまいだったのでここでメモ代わりに整理しておきます。主にインストール用に複数のパッケージをまとめた物がメタ、特定の機能に対して実装(パッケージ)の選択肢を持たせるのがバーチャルとなります。
# apt update # apt install unzip apache2 mariadb-server-10.5 php8.2-gd libapache2-mod-php8.2 php8.2-mysql php8.2-curl php8.2-mbstring php8.2-intl php8.2-imagick php8.2-xml php8.2-zip
MariaDB をインストールしましたので、MariaDBのセキュリティの初期化をします。rootのパスワード設定以外は基本デフォルト値で進めていけばいいと思います。
# セキュリティの初期化実行 # mysql_secure_installation # 現在の root のパスワード 初回は空白 Enter current password for root (enter for none): # Unixソケット認証を使うか(Yにすれば OS特権ユーザーからのパスワードレスログインが可能です # Switch to unix_socket authentication [Y/n] # root のパスワード設定をするか Change the root password? [Y/n] # パスワードの設定 ... # 匿名ユーザーを排除するか Remove anonymous users? [Y/n] # リモートからのrootログインを拒否するか Disallow root login remotely? [Y/n] # テストデータベースの削除 Remove test database and access to it? [Y/n] # 権限テーブルの更新をするか Reload privilege tables now? [Y/n] Thanks for using MariaDB!
MariaDBへログインしてNextcloud用のデータベースを作ります。
MariaDB> create database nextcloud; MariaDB> create user nextcloud; MariaDB> grant all privileges on nextcloud.* to 'nextcloud'@'localhost' identified by '[ユーザーパスワード]';
先ほどダウンロードしたzipファイルを展開してapacheに配置します。中身の所有権をapacheの実行ユーザーに変更します。
ここではダウンロードしたファイルが latest.zip 展開して作成されたディレクトリが nextcloud でした。
# unzip latest.zip # mv nextcolud /var/www/html/ # chown chown -R www-data:www-data /var/www/html/nextcloud/
ここまで設定したら、ブラウザからの操作で設定を続けます。
ブラウザに先ほどMariaDBで作成したユーザーとそのパスワードを入力します。
これで Nextcloud のインストールは完了です。
Collabora Online
Nextcloudのインストールでファイルサーバーとして機能するようになりました。
ただ、この状態だとOffice系のドキュメントはブラウザでは表示されず、ダウンロードされます。
今度はこのOffice系のドキュメントをブラウザ上で編集できるようにするために、Collabora Online をインストールします。
オフィス系のドキュメントの表示や加工は、過去にこのブログで宛名印刷に使用したこともあるLibreOfficeがベースとなっています。言い換えると、Collabora Online は Libreoffice をブラウザ上で利用可能にするものです。
Collabora Online は小規模・テスト用の Collabora Online Develop Edition (CODE)が無料で使える他に、有償のサポート付きバージョンがあります。
ここではCODE(無料バージョン)を使います。
CODEのソースコードはgithubで管理されています。
まず核となるアプリケーションである Libreofficeが必要です。
LibreOffice自体は APT でもソースをダウンロードすることが可能ですが、Collabora Online が必要としているバージョンと差があると思います。そのような場合は通常ソースからビルドする方法もありますが、Libre Officeのビルドは長くなるようなので、CODEが使う部分だけにまとめたソースを使います。Collabora Onlineで紹介されているLibreOffice-coreのソースをダウンロードします。
git や buid環境をインストールしておきます。筆者の環境でビルド中に必要になった他のパッケージに、libtool、pkg-config、libpoco-dev、nodejs、npm、python3-lxml、python3-polib、libpng-dev、libcppunit-dev、libzstd-dev、chromiumがありました。
また make で実行されるコード内部で sudo が利用されているようなので、sudo 環境でない場合はインストールしておきます。
補足:sudoの設定
まず管理者権限で sudo をインストールします。
Debianでは、sudo グループに所属するものが sudoを実行できるので、現ユーザーをsudo グループへ加えます。
ログインし直します。
または visudo で直接権限を設定する事も可能です。
公式ページの要件には、前述の他、dialog fontconfig、libcap-dev、libcap2-bin、libpam-dev(libpam0g-dev) が指定さてていましたので、合わせてインストールしておきます。
また、cypress_test をする場合は、xvfb(X Windowsystemを使わずにGUIをエミュレートする)も必要です。
# cd /usr/local/src # wget https://github.com/CollaboraOnline/online/releases/download/for-code-assets/core-co-23.05-assets.tar.gz
ダウンロードが終わったら、展開します。また、展開したディレクトリの親ディレクトリ(ここでは /usr/local/src )を、LOCOPREPATH 環境変数に設定します。
# tar -vzxf core-co-23.05-assets.tar.gz ... # export LOCOREPATH=$(pwd)
# git clone https://github.com/CollaboraOnline/online.git
clone が終わったら online ディレクトリに移動して、autogen.sh を起動し、その後 configure スクリプトにオプションを渡して実行します。
$ cd online # ./autogen.sh ... # ./configure --enable-silent-rules --with-lokit-path=${LOCOREPATH}/include --with-lo-path=${LOCOREPATH}/instdir --enable-debug --enable-cypress ..
pkg-config がないと configure スクリプトの PKG_CHECK_MODULES の辺りで、例えば「 ./configure: line 20077: syntax error near unexpected token `PNG,' 」といったエラーが出ます。もしエラーがでたらインストール後、autgen.shからやり直します。
./configure の後に make を実行します。筆者のテスト用のWindows7世代の非力なPCで30分ぐらいかかりました。
途中、node 系のパッケージのインストールがあります。make 中 「 idealTree ... 」と表示される部分でレスポンスが極端に遅かったら次のことを試してみて下さい。
node のレポジトリソースとなっているドメインがIPv6のアドレスの返すため起きるようです。
その場合はOS側の設定を変更してIPv4優先するようにします。/etc/gai.conf にそれ用の設定をする場所が用意されています。
/etc/gai.conf
... # For sites which prefer IPv4 connections change the last line to # コメントアウトを外します precedence ::ffff:0:0/96 100
make が終了したら、 make check でチェックします。チェックはユーザー権限で実行する必要がありますが、一連のビルドをrootで実行した場合は online 以下のファイルやディレクトリの所有権をすべてテスト実行ユーザーにしておきます。
また quarantine チェックでは、online の親ディレクトリに実行ユーザーの書き込み権限のある quarantine ディレクトリがないとエラーになるようです。
ログは test ディレクトリへ出力されます。全体のログと個別のログがあります。コンソール出力中にどのテストでエラーが発生したかやそのログファイル名が === で区切られた形で出力されますので、それも参考にエラーを確認します。
通常のtestがエラーなく終了すると、cypress_test が実行されます。
make run でテスト稼働ができます。こちらもユーザー権限で実行する必要があります。この時の操作やオプションが本番(サービス)環境構築のヒントになります。
テスト稼働が正常に完了するとコンソール最後に、サンプルファイルのアドレスが表示されます(例: http://localhost:9980/browser/6f749b1055/debug.html?file_path=/usr/local/src/online/test/data/hello-world.odt)。このアドレス宛にブラウザよりアクセスしてみて LibreOffice に似たUIががブラウザ内に表示されれば make は完了です。
最後に make install でファイルを配置します。その際生成されるディレクトリ /usr/local/share/coolwsd の所有権を後で作成するサービス実行ユーザーである、cool へ変更します)
もしビルドがうまくいかない場合は、CODEのパッケージレポジトリを追加して、APT経由でインストールする方法もありますので、ビルドがうまくいかない場合はこちらの採用も検討してください。 その場合は、hold(apt mark hold coolwsd) しておくことをおすすめします。
coolwsdの設定
デフォルトでは make install で本体は(coolwsd)が /usrl/local/bin へ、設定ファイルは、/usr/local/etc/coolwsd/coolwsd.xml となります。これとは別に、Webサーバー用(apache or nginx)の設定ファイルも出力されますが、今回それを操作する必要はありませんでした。
主な設定は次のようになると思います。
coolwsd.xml
... <!-- systemplateのパス --> <sys_template_path type="path" relative="true" default="systemplate">/var/cool/systemplate</sys_template_path> ... <!-- chroot用のパス --> <child_root_path type="path" relative="true" default="jails">/var/cool/jails</child_root_path> ... <!-- file server としてのrootディレクトリ --> <file_server_root_path type="path" relative="true" default="browser/../">/usr/local/share/coolwsd</file_server_root_path> ... <!-- logの設定 --> <logging> ... </logging> ... <!-- SSLの設定 --> <ssl desc="SSL settings"> <as_scheme type="bool">true</as_scheme> <enable type="bool">true</enable> <cert_file_path desc="Path to the cert file" relative="false">/var/cool/ssl/cert.pem</cert_file_path> <key_file_path desc="Path to the key file" relative="false">/var/cool/ssl/key.pem</key_file_path> <ca_file_path relative="false">/var/cool/ssl/ca-chain.cert.pem</ca_file_path> <cipher_list></cipher_list> </ssl> ... <!-- adminコンソールの設定 --> <admin_console> <enable>true</enable> <!-- PAMに変更するなら true に --> <enable_pam>false</enable_pam> <username>admin</username> <password>admin</password> ... </admin_console> ... <!-- storageの設定 --> <storage desc="Backend storage"> <filesystem allow="true" /> ... </storage>
筆者の環境だと、SSLの設定を有効にすると、CODE単独では起動できるのですが、nextcloud からファイルにアクセスできませんでした。そのような場合は設定をfalseにします。
次にサービスファイルを作りますが、そのまえにサービスを稼働するためのユーザーやそのホームディレクトリ等を作成します。
サービスファイル内では稼働ユーザーが cool となっています。ホームディレクトリは /opt/cool その 所有権は cool:cool という前提のようです。
/opt は特定のアプリケーション用のプログラムやデータを保存する場所なのですが、筆者は普段 /opt ディレクトリを使わないので /var/cool に差し替えます。
; サービス実行ユーザーの追加(cool)(r:システムユーザー、-d ホーム作成、シェル禁止) ; make run 時は capability の設定をする際に sudo が必要でしたが、サービス実行時は後述のように独立させるので不要だと思います。 # useradd -r -d /var/cool -s /usr/sbin/nologin cool ; ユーザーホームの作成 # mkdir /var/cool ; chroot用 dir 作成 # mkdir /var/cool/jails ; ssl用 dir 作成 # mkdir /var/cool/ssl ; 証明書 鍵コピー cp /usr/local/src/online/etc/ca-chain.cert.pem /var/cool/ssl cp /usr/local/src/online/etc/key.pem /var/cool/ssl cp /usr/local/src/online/etc/cert.pem /var/cool/ssl ; systemtamplate(chroot下で必要なシステムファイル群) コピー ; coolwsd-systemplate-setup /var/cool/systemplate /usr/local/src とする専用コマンドだと、エラーに遭遇しました # cp -R /usr/local/src/online/systemplate/ /var/cool ; 所有権・権限の修正 # chown -R cool:cool /var/cool # chmod 700 /var/cool # chmod 755 /var/cool/jails # chmod 400 /var/cool/ssl/* ; 共有ディレクトリも所有権を修正します # chown -R cool:cool /usr/share/local/coolwsd
次にサービスファイルを作成します。ここではサービスファイルを2分割します。
まず make check 時に実行された、次のコマンド部分をサービス化します。これはルート権限で稼働させ、後で作成するサービスを起動させる際の要件とします。
これは coolforkit と coolmount コマンドに権限を与えるものです。
pre-coolwsd.service
[Unit] Description=Prepare for coolwsd After=network.target [Service] Type=oneshot ExecStart=/bin/bash -c "/sbin/setcap cap_fowner,cap_chown,cap_mknod,cap_sys_chroot=ep /usr/local/bin/coolforkit && /sbin/setcap cap_sys_admin=ep /usr/local/bin/coolmount" # coolwsd.serviceが依存するサービスなので # コマンド実行後もステータスを残します RemaintAfterExit=yes [Install] WantedBy=multi-user.target
次に coolwsd.service 本体です。環境により違うと思いますが、/usr/local/src/online/debian/coolwsd.service にある内容を参考に次のようにしました。下線部がサンプルファイルを修正した箇所です。
coolwsd の capabilityはこのサービスファイル内で設定しています。
/etc/systemd/system/coolwsd.service
[Unit] Description=Collabora Online WebSocket Daemon # 先に作成したサービスの後に起動させるようにします After=pre-coolwsd.service [Service] # 利用していませんがDebianの環境変数ファイルは主に default にあるので修正しておきます # ファイル自体は存在しませんが、 - がついているのでエラーになりません EnvironmentFile=-/etc/default/coolwsd # Build した場合、バイナリは local に配置されます。 # テストで --o オプションで設定していた各種パラメータは coolwsd.xml に記述します。 ExecStart=/usr/local/bin/coolwsd --config-file=/usr/local/etc/coolwsd/coolwsd.xml KillSignal=SIGINT TimeoutStopSec=120 User=cool KillMode=mixed Restart=always LimitNOFILE=infinity:infinity ProtectSystem=strict ReadWritePaths=/var/cool /var/log ProtectHome=yes PrivateTmp=yes ProtectControlGroups=yes CapabilityBoundingSet=CAP_FOWNER CAP_CHOWN CAP_MKNOD CAP_SYS_CHROOT CAP_SYS_ADMIN [Install] WantedBy=multi-user.target
サービスファイルをリロードしてスタートさせます。
# systemctl daemon-reload # systemctl enable coolwsd # systemctl start coolwsd
coolwsdは基本的にユーザー権限からしか起動できませんが、デバッグとして root として起動したいケースがあれば --disable-cool-user-checking オプションをつけることで可能です。
前述のxml設定からログファイルを指定して作成することもできますが、サービスのログは「 journalctl -u coolwsd 」とすることで確認することもできます。
Nextcloud と Coolwsdの連携
Nextcloud と Coolwsdの連携連携は、Nextcloudの管理Web画面から行えます。
Nextcloudのユーザーアイコンメニューの「アプリ」から、「 Office & テキスト 」の項目で、Nextcloud Office の項目を探し、インストールします。
インストール後「管理者設定」の画面に、「 Nextcloud Office 」の項目が追加されますので、「 自分のサーバーを利用する 」オプションの、「 Collabora OnlineサーバーのURL (とポート) 」に、「 http(s)://インストールしたサーバーのIP:ポート 」を入力します。筆者はここの設定においてSSL化はできませんでしたが、自己署名CAを使っている場合は下のチェックボックスにチェックを入れます。
Collabora Onlineのデフォルトポートは 9980 です。
あとは「管理者設定」のコンソールに出力される、警告に合わせて設定をしたり、リバースプロキシの設定は手つかずですが、とりあえず稼働するようにはなりました。