null ONLYOFFICE連携でOfficeファイルのオンライン編集を試す

こんにちは。今回は、ONLYOFFICEという製品と連携してAlfresco上のOfficeファイルをオンライン編集する機能を試してみたので、その手順をご紹介します。ONLYOFFICEは、ラトビアのAscensio System社によって開発されている、Microsoft Officeと互換性のあるオープンソースのオンラインオフィススイート製品です。ONLYOFFICEのDocument Serverを立てて、Alfrescoと連携させることでAlfresco上のOfficeファイルをオンラインで(ブラウザで)編集できるようになり、複数ユーザによる共同編集も可能になります。

今回は、ONLYOFFICE連携の機能を手っ取り早く試すことを目的としているため、Alfresco SDKで作成したプロジェクト(カスタマイズ開発を行うための環境)を使っています。本番環境で使うことを想定した手順ではないのでご注意ください。また、コンテナを多数起動するため、メモリはそれなりに必要になると思います(参考までに手元のMacBook Proはメモリ16GBですが問題なく動いています)。今回使用した主なソフトウェアのバージョンは以下のとおりです。

  • Alfresco SDK 4.5
  • Alfresco-ONLYOFFICE連携モジュール v6.1.0
  • ONLYOFFICE Document Server v7.4.0.60
  • Docker 20.10.24
  • Docker Compose v2.17.2

準備

こちらの記事等を参考にして、Alfresco SDKでalfresco-allinone-archetypeのプロジェクトを作成しておいてください。今回は前述の記事に従ってSDK 4.5で作成したプロジェクトを使用します。

Alfresco-ONLYOFFICE連携モジュールのインストール

AlfrescoにONLYOFFICE連携用のカスタムモジュールをインストールします。GitHubから、記事執筆時点(2023年4月)の最新版であるv6.1.0の以下の2つのampファイルをダウンロードします。

  • onlyoffice-integration-repo.amp
  • onlyoffice-integration-share.amp

この2つのampファイルを、それぞれ以下のフォルダに格納します(extensionsフォルダがない場合は作成してください)。{artifactId}はSDKでプロジェクトを作成する際に指定した値に置き換えてください。

  • {artifactId}-platform-docker/src/main/docker/extensions/onlyoffice-integration-repo.amp
  • {artifactId}-share-docker/src/main/docker/extensions/onlyoffice-integration-share.amp

最後に、Dockerイメージのビルド時に上記のampファイルをインストールするための設定を、{artifactId}-platform-dockerと{artifactId}-share-dockerのpom.xmlに追記します。

{artifactId}-platform-docker/pom.xmlには、以下のように2行だけ追記します。

<!--前略(79行目から)-->
    <!-- Filter the Dockerfile and the other files added to the container to be able to replace maven properties -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-and-filter-docker-resources</id>
                <phase>validate</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/docker</directory>
                            <filtering>true</filtering>
                            <excludes>
                                <exclude>**/*.jar</exclude>
                                <exclude>**/*.so</exclude>
                                <exclude>**/*.gz</exclude>
                                <exclude>**/*.amp</exclude> <!--追加-->
                            </excludes>
                        </resource>
                    </resources>
                </configuration>
            </execution>
            <execution>
                <id>copy-and-filter-docker-resources-non-filtered</id>
                <phase>validate</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/docker</directory>
                            <filtering>false</filtering>
                            <includes>
                                <include>**/*.jar</include>
                                <include>**/*.so</include>
                                <include>**/*.gz</include>
                                <include>**/*.amp</include>  <!--追加-->
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>
<!--後略-->

{artifactId}-share-docker/pom.xmlには、以下のように追記します。

<!--前略(48行目から)-->
    <!-- Filter the Dockerfile and the other files added to the container to be able to replace maven properties -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-and-filter-docker-resources</id>
                <phase>validate</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/docker</directory>
                            <filtering>true</filtering>
                            <excludes>                        <!--追加-->
                                <exclude>**/*.amp</exclude>   <!--追加-->
                            </excludes>                       <!--追加-->
                        </resource>
                    </resources>
                </configuration>
            </execution>
            <execution>                                                            <!--追加-->
                <id>copy-and-filter-docker-resources-non-filtered</id>             <!--追加-->
                <phase>validate</phase>                                            <!--追加-->
                <goals>                                                            <!--追加-->
                    <goal>copy-resources</goal>                                    <!--追加-->
                </goals>                                                           <!--追加-->
                <configuration>                                                    <!--追加-->
                    <outputDirectory>${project.build.directory}</outputDirectory>  <!--追加-->
                    <resources>                                                    <!--追加-->
                        <resource>                                                 <!--追加-->
                            <directory>src/main/docker</directory>                 <!--追加-->
                            <filtering>false</filtering>                           <!--追加-->
                            <includes>                                             <!--追加-->
                                <include>**/*.amp</include>                        <!--追加-->
                            </includes>                                            <!--追加-->
                        </resource>                                                <!--追加-->
                    </resources>                                                   <!--追加-->
                </configuration>                                                   <!--追加-->
            </execution>                                                           <!--追加-->
        </executions>
    </plugin>
<!--後略-->

ONLYOFFICE連携モジュールをインストールするための設定は以上です。この時点で一旦 ./run.sh build_start でAlfrescoを起動して無事にインストールされているかどうか確認します。

Alfrescoが起動したらブラウザで http://localhost:8080/alfresco/s/onlyoffice/onlyoffice-config を開き、ONLYOFFICE連携の設定画面が表示されればPlatform側へのインストールは成功です。

Shareの方は、適当なフォルダにOfficeファイルをアップロードして、「Edit in ONLYOFFICE」等のアクションメニューが表示されることが確認できればカスタムモジュールのインストールは成功です(ただし、この時点ではONLYOFFICEのDocument Serverを起動していないのでメニューをクリックしてもエラーになります)。

ONLYOFFICE Document Serverの起動

次に、ONLYOFFICE Document Serverを公式ページの手順に従ってdocker composeで起動します。適当なフォルダに移動して以下のコマンドを実行します。GitHubからcloneした後、masterブランチで続けても問題ないんですが記事執筆時点のバージョンを明確にするためにv7.4.0.60のタグをチェックアウトしてあります。

git clone https://github.com/ONLYOFFICE/Docker-DocumentServer
cd Docker-DocumentServer
git checkout v7.4.0.60
docker-compose up -d
docker-compose logs -f

起動したらブラウザで http://localhost/ を開き、Welcomeページが表示されれば成功です。

次に、Welcomeページに書かれているとおり、以下のコマンドでシークレットキーを取得しておきます。

docker exec onlyoffice-documentserver /var/www/onlyoffice/documentserver/npm/json -f /etc/onlyoffice/documentserver/local.json 'services.CoAuthoring.secret.session.string'
0ByrReFCx0oAeVAOhUugTTQy7WPt508H

以上でDocument Serverの準備は完了です。

ONLYOFFICE連携のためのAlfrescoの設定

先ほどAlfresco-ONLYOFFICE連携モジュールのインストール結果の確認で開いた設定画面( http://localhost:8080/alfresco/s/onlyoffice/onlyoffice-config )をブラウザで開き、以下のように入力します。

1つ目の「Document Editing Service address」にはクライアントからアクセス可能なDocument ServerのURLを入力します。今回はDockerコンテナとして起動してホストの80番ポートをコンテナの80番ポートに紐づけてあり、クライアントとホストが同じという状態なので「http://127.0.0.1/」というURLを指定してあります(デフォルト値なので変更は不要です)。

2つ目の「Secret key」には先ほど取得した値を入力します。

3つ目の「Document Editing Service address for internal requests from the server」には、Alfrescoサーバからアクセス可能なDocument ServerのURLを入力します。今回はAlfrescoコンテナからホストを経由してDocument Serverにアクセスするため、host.docker.internal というコンテナからホストを参照するためのドメインを使用しています。

4つ目は3つ目とは逆でDocument ServerからAlfrescoにアクセスするためのURLなのですが、ここも同様にホストを経由してアクセスするように host.docker.internal を使用して指定します。

入力し終わったら画面の一番下の「Save」ボタンを押せば完了です。

Officeファイルのオンライン編集のテスト

ブラウザでShareの画面を開き、適当なOfficeファイルの右側から「Edit in ONLYOFFICE」をクリックします。ONLYOFFICEで編集する画面が表示されれば成功です。編集して保存して(デフォルトの設定で自動保存になっているはずです)ウィンドウ(タブ)を閉じれば、Alfresco上のファイルのバージョンが上がり、中身も更新されているはずです。

以上、AlfrescoとONLYOFFICEを連携させてOfficeファイルのオンライン編集を試す手順をご紹介しました。「Edit in ONLYOFFICE」以外にもShareのアクションメニューにはONLYOFFICEとの連携機能が追加されているので、いろいろ試してみていただければと思います。ブラウザを変えたりシークレットウィンドウを使えば複数ユーザによる共同編集も試せると思います。

関連記事
customize

RANKING
2020.10.12
2020.11.19
2020.12.23
2020.10.05
2020.11.25