Alibaba CloudのサーバレスKubernetesを使ってOnlyOfficeをデプロイし、Nextcloudと連携してみた※構築手順付き

2022年8月30日掲載

キービジュアル

Alibaba CloudのサーバレスkubernetesサービスASK上で構築したNextcloudを利用する際、Officeのファイルをそのまま開きたい、また共同編集をしたいとの声がありました。

前回記事(Alibaba CloudのSimple Application Serverを使ってOnlyOfficeをデプロイし、Nextcloudと連携してみた)でその方法を紹介しましたが、実はKubernetesでNextcloudとOnlyOffice両方デプロイできた方が管理しやすいと思いますので、今回はAlibaba CloudのサーバレスKubernetesサービス(ASK)を使ってNextcloudとOnlyOfficeをデプロイし、連携する方法を紹介します。

目次

概要構成図

全体からみる俯瞰的な構成図は次の通りです。

サーバレス版KubernetesにNextcloudとOnlyOfficeをデプロイすることで、NextcloudでOfficeファイルが使えるようになります。

OnlyOfficeはAscebsio Systems社が開発するサーバーアプリケーションで、Nextcloudの他、ownCloudやjira、Confluence、Alfresco、Chamilo、他のクラウドにもアタッチすることができます。そのため、NextcloudとOnlyOfficeは別々のプラットフォームなので、全体的なフローとしては次の通りになります。

ユーザがWebブラウザでNextcloudのOfficeへアクセスしたら、サーバレスkubernetesサービスASK上のNextcloudからOnlyOfficeサーバへリクエスト処理します。NextcloudはOfficeファイルを管理する一方で、OnlyOfficeはOfficeファイルのデータを管理する役割を持つため、OfficeファイルはOnlyOfficeとNextcloudが連携で管理する必要があります。

ユーザが指定した特定のOfficeファイルをNextcloudサーバ経由で閲覧・編集操作できるようになれば、WebブラウザのNextcloud経由でOfficeファイルを閲覧、編集することができます。

AlibabaCloud上にNextcloudをデプロイする方法は以前のブログをご参考ください。

参考:サーバレス版KubernetesでNextcloudをAlibaba Cloud上に構築する手順

構築手順 - 1. Container RegistryにOnlyOfficeイメージを格納

ASKではDockerHubのOfficial Imageのみサポートしています。

OnlyOfficeのImageはOfficial Imageではないため、Alibaba Cloudが提供しているImageを格納するリポジトリサービス:Container RegistryにOnlyOfficeのImageを格納する必要があります。

Dockerがインストールされている端末に以下のコマンドを実行します。

イメージをダウンロードします。

$ sudo docker pull onlyoffice/documentserver

Alibaba Cloudのリポジトリにログインします。

$ sudo docker image list

ImageをAlibaba Cloudのリポジトリにアップロードします。

$ sudo docker tag 5a50e3a2d2ed registry-intl.ap-northeast-1.aliyuncs.com/onlyofficenamespace/onlyoffice:latest

$ sudo docker push registry-intl.ap-northeast-1.aliyuncs.com/onlyofficenamespace/onlyoffice:latest

コマンドの実行結果は以下の通りです。

Imageアップロードが成功しましたら、Alibaba Cloudのコンソールで確認できます。

構築手順 - 2. ASKにNextcloudのYAMLをデプロイ

Nextcloudのデプロイ方法は前回のブログで詳細を紹介しました。以下のSTEPが必要です。

  • STEP1: 証明書アップロード
  • STEP2: VPC、VSwitch(ZoneA、ZoneB)作成
  • STEP3: ApsaraDB for MariaDB作成
  • STEP4: ASK(Serverless Kubernetes)でNextcloudをデプロイ
  • STEP5: OSS作成
  • STEP6: OSSアクセス用RAMユーザ作成
  • STEP7: NextCloudにて外部ストレージとなるOSSをバインド

今回はSTEP4のYAMLファイルの中身のみ変更になりますので、STEP4のみ詳細を紹介させて頂きます。STEP4以外の手順に関しては前回のブログをご参考ください。

ASK(Serverless Kubernetes)でNextcloudをデプロイ

コンソール画面から Container Service for Kubernetes (ACK)へページ遷移し、タブバーにある Serverless Kubernetes(ASK)を選定します。あとは図の通り、パラメータ設定しながらクラスター作成へ進みます。

diskも作成します。

永続ボリュームクレーム(PVC)を作成します。ここでの名前は「nextcloud-pv-claim」にしています。

以下YAMLソースコードをコピーしながらACKコンソール画面にて貼り付け、デプロイします。

apiVersion: alibabacloud.com/v1

kind: AlbConfig

metadata:

  name: default

spec:

  config:

name: alb-nextcloud

addressType: Internet

zoneMappings:

- vSwitchId: vsw-6wesjvmih2algpwqk4q70

- vSwitchId: vsw-6we735r6gd2x9ycf64ior

---

apiVersion: networking.k8s.io/v1

kind: IngressClass

metadata:

  name: alb

spec:

  controller: ingress.k8s.alibabacloud/alb

  parameters:

apiGroup: alibabacloud.com

kind: AlbConfig

name: default

---

apiVersion: v1

kind: Service

metadata:

  name: nextcloud

  labels:

app: nextcloud

spec:

  ports:

  - port: 80

targetPort: 80

  selector:

app: nextcloud

tier: frontend

  type: NodePort

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nextcloud

  labels:

app: nextcloud

spec:

  selector:

matchLabels:

  app: nextcloud

  tier: frontend

  strategy:

type: Recreate

  template:

metadata:

  labels:

    app: nextcloud

    tier: frontend

spec:

  volumes:

  - name: configmap

    configMap:

      name: reverse-proxy

      items:

      - key: reverse-proxy.config.php

        path: reverse-proxy.config.php

  - name: nextcloud-ps

    persistentVolumeClaim:

      claimName: nextcloud-pv-claim

  containers:

  - image: nextcloud:latest

    name: nextcloud

    env:

    - name: OVERWRITEHOST

      value: k8s2nextcloud.sbcicp1.net

    - name: OVERWRITEPROTOCOL

      value: https

    - name: PHP_MEMORY_LIMIT

      value: 20480M

    - name: PHP_UPLOAD_LIMIT

      value: 20480M

    - name: ONLYOFFICE

      value: "true"

    ports:

    - containerPort: 80

      name: nextcloud

    volumeMounts:

    - name: configmap

      mountPath: /var/tmp

    - name: nextcloud-ps

      mountPath: /var/www/html

    lifecycle:

      postStart:

        exec:

          command: ['sh', '-c', 'cp -f /var/tmp/reverse-proxy.config.php /var/www/html/config/reverse-proxy.config.php']

---

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: nextcloudingress

  namespace: default

spec:

  ingressClassName: alb

  tls:

  - hosts:

- k8s2nextcloud.sbcicp1.net

  rules:

- host: k8s2nextcloud.sbcicp1.net

  http:

    paths:

      - backend:

          service:

            name: nextcloud

            port:  

              number: 80

        path: /

        pathType: Prefix

---

apiVersion: v1

kind: ConfigMap

metadata:

    name: reverse-proxy

data:

  reverse-proxy.config.php: |

    <?php

    $overwriteHost = getenv('OVERWRITEHOST');

    if ($overwriteHost) {

      $CONFIG['overwritehost'] = $overwriteHost;

    }

 

 

    $overwriteProtocol = getenv('OVERWRITEPROTOCOL');

    if ($overwriteProtocol) {

      $CONFIG['overwriteprotocol'] = $overwriteProtocol;

    }

 

 

    $overwriteCliUrl = getenv('OVERWRITECLIURL');

    if ($overwriteCliUrl) {

      $CONFIG['overwrite.cli.url'] = $overwriteCliUrl;

    }

 

 

    $overwriteWebRoot = getenv('OVERWRITEWEBROOT');

    if ($overwriteWebRoot) {

      $CONFIG['overwritewebroot'] = $overwriteWebRoot;

    }

 

 

    $overwriteCondAddr = getenv('OVERWRITECONDADDR');

    if ($overwriteCondAddr) {

      $CONFIG['overwritecondaddr'] = $overwriteCondAddr;

    }

 

 

    $trustedProxies = getenv('TRUSTED_PROXIES');

    if ($trustedProxies) {

      $CONFIG['trusted_proxies'] = array_filter(array_map('trim', explode(' ', $trustedProxies)));

    }

 

 

    $onlyOffice = getenv('ONLYOFFICE');

    if ($onlyOffice) {

      $CONFIG['onlyoffice'] = array (

        'verify_peer_off' => true,

        'jwt_header' => "AuthorizationJwt"

      );

    }

前回Nextcloudデプロイ時のYAMLファイルとの変更点は以下です。

NextcloudとOnlyOfficeを連携する際、Nextcloudのconfig.phpに以下の内容を追加する必要があります。

 'onlyoffice' => array (

    'verify_peer_off' => true,

    'jwt_header' => "AuthorizationJwt"

  ),

上記の設定は環境変数で定義されていないため、環境変数を追加するだけでは対応できません。ConfigMapを使って追加する必要があります。

config.phpには色々な環境変数があるため、ConfigMapでそのままconfig.phpを上書きすると、構築する度に手修正が発生し、手順が煩雑になります。今回は環境変数を定義するファイル:reverse-proxy.config.phpをConfigMapを使って上書きすることにしました。

構築手順 - 3. ASKにOnlyOfficeのYAMLをデプロイ

以下YAMLソースコードをコピーしながらACKコンソール画面にて貼り付け、デプロイします。

apiVersion: v1

kind: Service

metadata:

  name: onlyoffice

  labels:

app: onlyoffice

spec:

  ports:

  - port: 80

targetPort: 80

  selector:

app: onlyoffice

tier: frontend

  type: NodePort

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: onlyoffice

  labels:

app: onlyoffice

spec:

  selector:

matchLabels:

  app: onlyoffice

  tier: frontend

  strategy:

type: Recreate

  template:

metadata:

  labels:

    app: onlyoffice

    tier: frontend

spec:

  containers:

  - image: registry-intl-vpc.ap-northeast-1.aliyuncs.com/onlyofficenamespace/onlyoffice:latest

    name: onlyoffice

    env:

    - name: JWT_ENABLED

      value: "true"

    - name: JWT_SECRET

      value: "45713791378C43A0DD1AD628777961F175314040C309316A060DA83C1210E92F"

    - name: JWT_HEADER

      value: "AuthorizationJwt"

    - name: JWT_IN_BODY

      value: "true"

    - name: USE_UNAUTHORIZED_STORAGE

      value: "true"

    ports:

    - containerPort: 80

      name: onlyoffice

    volumeMounts:

    - name: onlyoffice-data

      mountPath: /var/www/onlyoffice/Data

  volumes:

  - name: onlyoffice-data

    persistentVolumeClaim:

      claimName: onlyoffice-pv-claim

---

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: onlyofficeingress

  namespace: default

  annotations:

nginx.ingress.kubernetes.io/ssl-redirect: "true"

spec:

  ingressClassName: alb

  tls:

  - hosts:

- onlyoffice.sbcicp1.net

  rules:

- host: onlyoffice.sbcicp1.net

  http:

    paths:

      - backend:

          service:

            name: onlyoffice

            port:  

              number: 80

        path: /

        pathType: Prefix

構築手順 - 4. Nextcloud側でOnlyOfficeを設定

注目のアプリからOnlyOfficeをダウンロードして有効にします。

OnlyOfficeのサーバのアドレス及びシークレットキーを入れます。シークレットキーはDocker runで設定した際に指定した値を入れます。「設定が更新されました」と表示されれば、接続成功です。

以下の通り、Wordのファイルを開くことができました。

ハマったポイント①

NextcloudでOnlyOfficeを設定した後、以下のエラーが表示されました。

接続時にエラーが発生しました (cURL error 28: Failed to connect to onlyoffice.sbcicp1.net port 80: Connection timed out (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://onlyoffice.sbcicp1.net/cache/files/conv_check_871737911_docx/output.docx/check_871737911.docx?md5=KSw_tzbPJinfV4Vsi5MRNQ&expires=1659439121&filename=check_871737911.docx) (バージョン 7.1.1.23)

 

対策:

httpsでURLを設定したものの、実際NextcloudからOnlyOfficeに通信する際、httpの通信が発生します。セキュリティ的にhttpの通信を許可していないため、OnlyOfficeのYAMLファイルにhttpの通信が来たら、httpsにリダイレクトするように設定を追加して、解決になりました。ドキュメントを読むと、defaultがtrueのようですが、明示的に設定が必要でした。

設定追加内容

  annotations:

nginx.ingress.kubernetes.io/ssl-redirect: "true"

ハマったポイント②

ConfigMapの正しいmount先は/var/www/html/configですが、mountPathを/var/www/html/configで指定すると、configフォルダ配下のファイルが全部消されて、reverse-proxy.config.phpのみ残ることになり、NextCloudにアクセスできません。

対策:

/var/tmpには何もファイルがないため、mountPathを以下の通りに変更します。

     volumeMounts:

    - name: configmap

      mountPath: /var/tmp

その後、/var/tmpにあるreverse-proxy.config.phpを/var/www/html/config/reverse-proxy.config.phpにコピーすると問題なくアクセスできるようになりました。

lifecycle:

postStart:

exec:

command: ['sh', '-c', 'cp -f /var/tmp/reverse-proxy.config.php /var/www/html/config/reverse-proxy.config.php']

さいごに

今回はAlibaba CloudのサーバレスKubernetesを使ってNextcloudとOnlyOfficeをデプロイし、連携してみました。

OnlyOfficeはNextcloudだけでなくownCloudやjiraなどと連携ができるため、もしNextcloud以外のプラットフォームを使ってOnlyOfficeを利用する場合はAlibaba Cloud Simple Application Serverを使ってOnlyOfficeをデプロイし連携する方が汎用的です。

一方、Nextcloudのみ利用であれば、本記事のようにNextcloudとOnlyOfficeをまとめてサーバレスKubernetesにデプロイすれば、セキュリティやコスト観点的にメリットがあります。

Nextcloudはオフィス版ITとして非常に便利なうえ、MS OfficeライセンスなしでOfficeを利用することができるのでビジネスシーンにおいても非常に価値が高いです。別途記事にあるように、Google CloudやAWSなどにも同様に構築することができるため、クラウドベンダーを問わずにオフィス版ITとして様々な運用を行うことができます。

関連サービス

Alibaba Cloud

Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

$ sudo docker login --username=Alibaba CloudのAccount registry-intl.ap-northeast-1.aliyuncs.com

ダウンロードしたImageを確認します。

おすすめの記事

条件に該当するページがございません