フォーム読み込み中
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をデプロイする方法は以前のブログをご参考ください。
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のコンソールで確認できます。
Nextcloudのデプロイ方法は前回のブログで詳細を紹介しました。以下のSTEPが必要です。
今回はSTEP4のYAMLファイルの中身のみ変更になりますので、STEP4のみ詳細を紹介させて頂きます。STEP4以外の手順に関しては前回のブログをご参考ください。
コンソール画面から 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を使って上書きすることにしました。
以下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
注目のアプリから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として様々な運用を行うことができます。
$ sudo docker login --username=Alibaba CloudのAccount registry-intl.ap-northeast-1.aliyuncs.com
ダウンロードしたImageを確認します。
条件に該当するページがございません