Edited at

DockerでNextCloudを立てる


前提

DockerとDocker-composeはインストール済みとする。

また私はDocker・NextCloudどちらにも詳しいとは言えず、この記事はあくまで記録として残したものである。


目標

NextCloudを動かし、「SMB/CIFS対応」と「Redis」を導入する。


説明しないこと

HTTPSの設定などセキュリティ関係はここでは説明しない。

そのためインターネットに公開するのであれば(そしてサイバーノーガード戦法を取るのでなければ)他の記事を参照して設定する必要がある。

ちょうど私が投稿したのと同時期にNextcloud in Docker を自宅に構築 ~01_証明書章~という記事が上がっていたのでこの点に関してはそちらにお任せしたい。


(第一段階)最低限の動作

公式にあるとおりのdocker-compose.ymlを用意すればよい。


nextcloud/docker-compose.yml

version: '2'

volumes:
nextcloud:
db:

services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=適切なパスワード
- MYSQL_PASSWORD=適切なパスワード
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud

app:
image: nextcloud
ports:
- "8080:80"
depends_on:
- db
volumes:
- nextcloud:/var/www/html
restart: always


ここで

docker-compose up -d

してlocalhostの8080番にアクセスすればNextCloudのセットアップ画面が表示されるはずだ。

セットアップ画面で入力するのはまず

-管理者アカウント情報

それからDBの設定を開いて

-データベースの種類(=MySQL/MariaDB)

-データベースのユーザー名(=docker-compose.ymlのMYSQL_USERで指定したユーザー名)

-パスワード(=docker-compose.ymlのMYSQL_PASSWORDで指定したパスワード)

-データベース名(=docker-compose.ymlのMYSQL_DATABASEで指定した名前)

-アドレス(=MariaDBの場合dbコンテナのポート3306なのでdb:3306

となる。特に一番最後がつまづきがちなので注意。


(第二段階)Samba対応する

NextCloudは"External storage support"アプリで外部ストレージへの接続に対応している。

しかしそのなかでSMB/CIFSへの接続はphp-libsmbclient(もしくはフォールバックとしてlibsmbclient)が必要となる。実際使ってみたところlibsmbclientだけよりもphp-libsmbclientを入れたほうが快適に動作したのでこちらで説明する。

まずはdockerfileを作成する。公式で用意されているサンプルはlibsmbclientを入れるだけのものだが、ドキュメント中「PHP Module smbclient」に説明があるのでそちらを参照する。

docker-compose.ymlのあるディレクトリにbuildディレクトリを作ってそこにこんなファイルを置く。


nextcloud/build/Dockerfile

FROM nextcloud

RUN apt-get update \
&& apt-get install -y smbclient libsmbclient-dev \
&& pecl install smbclient \
&& docker-php-ext-enable smbclient \
&& rm -rf /var/lib/apt/lists/*


これをビルドすればイメージが出来るので、上述のdocker-compose.ymlを一部編集し


nextcloud/docker-compose.yml

  app:

#ビルドされたイメージにつける名前を指定する
image: nextcloud-smb
#イメージをビルドするコンテクストのある場所を指定する
build:
context: ./build
ports:
- "8080:80"
#以下省略

あとはdocker-compose up --build -dすれば自動でイメージがビルドされたうえでコンテナが稼働し、アクセスするとSMB/CIFSに接続できるようになっているはずだ。


(第三段階)Redisを使う

上記の手順だけでも動作はするが、どうにもレスポンスが遅く操作感が悪い。環境にもよるがキャッシュすることで大幅に改善するかもしれない。NextCloudのDocker imageはRedisに対応しているので早速導入する。まずはこんな感じでRedisのImageを追加する。


docker-compose.yml

#永続化のためのvolumeを追加

volumes:
nextcloud:
db:
redis: #<-NEW
# ~~略~~
# redisのコンテナを追加
redis:
image: redis
restart: always
volumes:
- redis:/data

それからRedisに接続できるように設定を書く。


docker-compose.yml

  app:

image: nextcloud
ports:
- "8080:80"
depends_on:
- db
- redis #<-NEW
volumes:
- nextcloud:/var/www/html
restart: always
environment:
- MYSQL_HOST=db
- REDIS_HOST=redis #<-NEW
#以下省略

あとは例によってdocker-compose up -dで一式立ち上げれば動作するはずだ。


サンプル

以上をまとめ、さらにdocker networkの設定や環境変数を追加すると以下のようなdocker-compose.ymlになる。


nextcloud/docker-compose.yml

version: '2'

volumes:
nextcloud:
db:
redis:

services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=適切なパスワード
- MYSQL_PASSWORD=適切なパスワード
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
networks:
- internal_network

app:
image: nextcloud-smb
build:
context: ./build
networks:
- internal_network
- external_network
ports:
- "8080:80"
depends_on:
- db
- redis
volumes:
- nextcloud:/var/www/html
restart: always
environment:
- MYSQL_HOST=db
- REDIS_HOST=redis

redis:
image: redis
restart: always
networks:
- internal_network
volumes:
- redis:/data

networks:
external_network:
internal_network:
internal: true



個人用メモ

DBのパスワードはnextcloud/nextcloud/config/config.php内にdbpasswordとして平文で保存されている。DBのパスワードを変更したときはここを書き換えればよい。