こんな感じでNextCloudをk8sにデプロイするとします。

nextcloud.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextcloud
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextcloud
  template:
    metadata:
      labels:
        app: nextcloud
    spec:
      containers:
        - name: nextcloud
          image: nextcloud
          env:
          - name: NEXTCLOUD_DATA_DIR
            value: /data
          ports:
            - containerPort: 80
              protocol: TCP
          volumeMounts:
          - name: myvolume
            subPath: config
            mountPath: /var/www/html
          - name: myvolume
            subPath: data
            mountPath: /data
      volumes:
        - name: myvolume
          persistentVolumeClaim:
            claimName: myvolume
      securityContext:
        fsGroup: 33
---
apiVersion: v1
kind: Service
metadata:
  name: nextcloud
  namespace: default
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
  selector:
    app: nextcloud
  clusterIP: None

すると初回ログイン後に以下のようなエラーが出てきます。

1
2
データディレクトリ (/data) は他のユーザーも閲覧する事ができます。
ディレクトリが他のユーザーから見えないように、パーミッションを 0770 に変更してください。

基盤側の都合でパーミッションを変えられないケースの回避策(無理矢理)を紹介します。

a. /var/www/html をPersistentVolume (ex. /config) に永続化している場合

PersistentVolume (hdd1) を適当なインスタンスにマウントし、以下のファイルをエディタで編集します。

/config/lib/private/legacy/OC_Util.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
...
	public static function checkDataDirectoryPermissions($dataDirectory) {
		if (\OC::$server->getConfig()->getSystemValue('check_data_directory_permissions', true) === false) {
			return  [];
		}

		$perms = substr(decoct(@fileperms($dataDirectory)), -3);
-   	if (substr($perms, -1) !== '0') {
+       if (substr($perms, -1) !== '7') {
- 		chmod($dataDirectory, 0770);
+ 		chmod($dataDirectory, 0777);
...

b. /var/www/html を永続化していない場合

Deploymentのlifecycle.postStartでパッチしてしまいます。

nextcloud.yaml

1
2
3
4
5
6
...
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "sed -i -e 's/xxx/XXX/g' /var/www/html/lib/private/legacy/OC_Util.php "]
...

書いておいてなんですが、全くもっておすすめできる方法ではありません。