NextcloudをRaspberry Pi 4にセットアップ(docker-composeで運用)、WebDAVでの動作確認も。

Posted by 雅楽斎 on Tuesday, February 2, 2021

TOC

NextcloudはSnapパッケージもあるがDocker(docker-compose)で運用

GNU AGPLv3+で提供されるNextcloudですが、簡便なインストール手順を検討するとsnapDockerがオフィシャルで用意されています。

Ubuntuで使う場合は個人的にsnapを使うことが多いですが、オンラインストレージという特性から、MicroSDで運用するには無理があり1、ストレージの保存場所はHDDにしたいところ。

snap板のNextcloudはストレージの保存場所をsnapパッケージ単位で設定するのではなく、環境変数SNAP_DATAを参照することから、全snapパッケージで同じ場所を使う必要が出てくることと、snapパッケージをハンドリングする際に動的に環境変数を変更する方法が恐らくないため、今回はsnapパッケージではなくDockerを使って(起動・停止はdocker-composeを使用)、Nextcloudを構築します。

GitHub - nextcloud-snap/nextcloud-snap: ☁️📦 Nextcloud packaged as a snap

☁️📦 Nextcloud packaged as a snap. Contribute to nextcloud-snap/nextcloud-snap development by creating an account on GitHub.

Docker, docker-composeをセットアップ

今回はインストールするDockerはUbuntuのdocker.ioパッケージにします。docker-composeもUbuntuのパッケージをそのままインストールします。環境はUbuntu 20.10です。

# apt-get install docker.io docker-compose

Dockerで使うストレージをUSB接続のHDDに変更

Dockerをそのまま使うとSDカードがあっという間になくなるので、イメージの格納先をUSB接続のHDDに変更します。

NanoPi M4V2にdockerを仕込む(microSD運用で乗り切る)

ストレージの自動マウントをSystemdで行う(AutoFSではなく))

HDDのマウントポイントは/mnt/usbhdd1/なので、変更方法は以下のようになります。

格納先ディレクトリを作成します。

# mkdir /mnt/usbhdd1/var/docker-image

systemdのサービス定義ファイルを変更用にコピーします。

# cp /lib/systemd/system/docker.service /etc/systemd/system/

/etc/systemd/system/docker.service[Service]のExecStart行の末尾に-g /mnt/usbhdd1/var/docker-imageを追加します。また、OSの起動時にUSB接続のHDDのマウントが終わってからサービスを起動するようにします。

該当する変更行は以下の通りです。

--- /lib/systemd/system/docker.service	2020-12-05 08:02:49.000000000 +0900
+++ /etc/systemd/system/docker.service	2021-01-26 00:24:24.084517108 +0900
@@ -1,7 +1,7 @@
 [Unit]
 Description=Docker Application Container Engine
 Documentation=https://docs.docker.com
-After=network-online.target firewalld.service containerd.service
+After=network-online.target firewalld.service containerd.service mnt-usbhdd1.automount
 Wants=network-online.target
 Requires=docker.socket
 Wants=containerd.service
@@ -11,7 +11,7 @@
 # the default is not to use systemd for cgroups because the delegate issues still
 # exists and systemd currently does not support the cgroup feature set required
 # for containers run by docker
-ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
+ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -g /mnt/usbhdd1/var/docker-image
 ExecReload=/bin/kill -s HUP $MAINPID
 TimeoutSec=0
 RestartSec=2

変更を反映します。

# systemctl daemon-reload
# systemctl restart docker

格納場所が変更されていることを確認します。

# docker info | grep Root
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No kernel memory TCP limit support
WARNING: No oom kill disable support
 Docker Root Dir: /mnt/usbhdd1/var/docker-image

docker-compose.ymlを作成

NextcloudのDockerイメージはDockerHubでARM64のイメージが配布されているので、Dockerfileからイメージをビルドすることなくそのままdocker pullするだけでコンテナを起動できます。

nextcloud - Docker Hub

docker-composeで運用するので、任意のディレクトリを作成します。

$ mkdir ~/nextcloud
$ cd ~/nextcloud

docker-compose.ymlを以下の内容を作成します( https://github.com/nextcloud/docker にあるまま)MYSQL_ROOT_PASSWORDMYSQL_PASSWORDは任意の値を使います。

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=nextcloud
      - MYSQL_PASSWORD=nextcloud
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

2021/11/21追記 rootless-dockerに移行した後にもう一度セットアップしようとしたら、管理者アカウントの作成時に

Error while trying to initialise the database: An exception occurred while executing a query: SQLSTATE[HY000]: General error: 4047 InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.

というエラーが発生したため、services/db/commandを以下のように変更しています。(–innnodb-file-per-table=1以降を追加)

--- docker-compose.yaml.org     2021-01-25 22:24:43.832358223 +0900
+++ docker-compose.yaml 2021-11-21 19:25:25.845339027 +0900
@@ -8,7 +8,7 @@
   db:
     image: mariadb
     restart: always
-    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
+    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
     volumes:
       - db:/var/lib/mysql
     environment:

docker-composeで起動

docker-compose.ymlがあるディレクトリでrootユーザーになって、起動します。

# docker-compose up -d

問題なく起動したら、ブラウザからhttp://192.168.1.210:8080/へ接続します(192.168.1.210は実行しているIPアドレス)

ということでNextcloudを使い始めることができるわけです。管理者アカウントを作成する作業に進みます。

Nextcloudのセットアップ

管理者アカウントの作成画面で「☑推奨アプリをインストール」で進むと、中でなにやら設定が終わった後にこんな画面が出て推奨アプリのインストール作業に進みます。これはこれで時間がかかります(通信速度の所以かもしれませんが)

終わったらこんな感じになるので進めていきます。

ログイン直後の画面です。ストレージにいくつかサンプルファイルが置かれていて、下にトークのメンションの有無、重要メール、カレンダーが見れるようになっています。

今回やりたいことは、手元にストレージとしてのWebDAVサーバーがなかったことなので、NASとは違った高機能ストレージとしてWebDAVサーバを構築することとスケジュールの管理を予定しています。

WebDAV接続

左上のメニューの右側にファイルマネージャのリンクがあるので、そこをクリックするとストレージの画面になります。

ストレージ画面になったら、左下の⚙設定をクリックするとWebDAV用のリンクが表示されます。これがWebDAVクライアントからアクセス先になります。

このURLは http://IPアドレス:8080/remote.php/dav/files/ユーザー名/ です。

試しにCaja2から接続してみます。

ファイル→サーバへ接続

接続先のサーバーの種類をWebDAV(HTTP)に変更します。

サーバーの接続先は接続先のURLをIPアドレス、ポート番号、接続先URLのパスに分解して設定、ユーザー名とパスワードはNextcloudのものを設定します。

全て入力したら「接続する」ボタンで接続します。

Nextcloudのストレージのファイルが表示されました。ファイル操作もここから行えます。処理のオーバーヘッドは多少ありますが、常に同期して動作していることを考えると使う分には問題ないかなという感触です。

カレンダーの設定についてはやってみたらすごく大変だったので別記事に纏めます。

スポンサーリンク


  1. 仕様として書き換え回数に寿命がある [return]
  2. NautilusのMATE名 [return]

comments powered by Disqus