DockerでNextcloud構築
はじめに
DockerでNextcloudを構築した際の作業メモ
構築時のポイント
- 既にデータが保存されているHDDをNextcloudに接続し参照できるようにする
- 各ユーザのデータディレクトリはシステムとは別のHDDに作成する
- ビデオファイルのサムネイル表示ができるようにする
- コンテナ内でcron実行ができるようにする
手順
docker関連ファイル準備
Dockerfileサンプル (Github - nextcloud/docker)
docker-composeサンプル (nextcloud - Official Image | Docker Hub)
環境
$ lsb_release -d
Description: Ubuntu 22.04.4 LTS
$ docker -v
Docker version 26.1.4, build 5650f9b
Compose V2を使用しているのでdocker-compose
コマンドではなくdocker compose
となっていることに注意
docker-compose
公式のサンプルを参考にして以下のように作成する.
version: '3'
services:
db:
image: mariadb:10.6
container_name: nextcloud_db
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${ENV_MYSQL_ROOT_PASSWORD}
- MYSQL_PASSWORD=${ENV_MYSQL_PASSWORD}
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
# image: nextcloud
container_name: nextcloud_app
build:
context: ./
dockerfile: Dockerfile
restart: unless-stopped
ports:
- 8080:80
links:
- db
volumes:
- ./app:/var/www/html
- /mnt/external_hdd1/nextcloud:/media/nextcloud
- /mnt/external_hdd2:/mnt/external_hdd
environment:
- MYSQL_PASSWORD=${ENV_MYSQL_PASSWORD}
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
- NEXTCLOUD_DATA_DIR=/media/nextcloud
- NEXTCLOUD_TRUSTED_DOMAINS=192.168.XX.YY
- PHP_MEMORY_LIMIT=1G
- PHP_UPLOAD_LIMIT=10G
volumesにて,Nextcloudで使用する外部HDDのディレクトリを指定している.
Nextcloud側の/media/nextcloud
に各ユーザが保存したファイルが格納されていくため,そこへホスト側の別HDDのディレクトリ(今回は/mnt/external_hdd1/nextcloud
)をマウントする.
また既にデータが保存されているHDD(今回は/mnt/external_hdd2
)もNextcloud側の任意のディレクトリへマウントする.
こちらのマウント先はこの後Nextcloud側の設定で外部ストレージとして指定することになる.
またcron実行できるコンテナを作成するにはデフォルトのimageから変更が必要なため,docker-compose.ymlと同じディレクトリに配置したDockerfileからビルドするよう指定する.
DBで使用するパスワードは以下のような.envファイルで任意の値を指定する.
ENV_MYSQL_ROOT_PASSWORD=root
ENV_MYSQL_PASSWORD=root
Dockerfile
Githubにcron実行可能なコンテナを作成できるDockerfileのexampleがあるためそれを参考に作成する.
変更点として,ビデオファイルのサムネイル表示のためにffmpegを追加でインストールするようにしている(詳細は後述).
FROM nextcloud:apache
RUN apt-get update && apt-get install -y \
supervisor \
&& apt-get -y install --no-install-recommends ffmpeg \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir /var/log/supervisord /var/run/supervisord
COPY supervisord.conf /
ENV NEXTCLOUD_UPDATE=1
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
Dockerfileで指定するsupervisord.confもexampleにあるものをコピーして作成する.
[supervisord]
nodaemon=true
logfile=/var/log/supervisord/supervisord.log
pidfile=/var/run/supervisord/supervisord.pid
childlogdir=/var/log/supervisord/
logfile_maxbytes=50MB ; maximum size of logfile before rotation
logfile_backups=10 ; number of backed up logfiles
loglevel=error
[program:apache2]
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=apache2-foreground
[program:cron]
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=/cron.sh
ディレクトリ構成
立ち上げ前のディレクトリ構成は以下
/nextcloud
|--.env
|--Dockerfile
|--docker-compose.yml
|--supervisord.conf
最終的なディレクトリ構造は以下
/nextcloud
|--.env
|--Dockerfile
|--app
| |--[Nextcloudデータ]
|--db
| |--[MariaDBデータ]
|--docker-compose.yml
|--supervisord.conf
バックアップ/リカバリする場合はこのディレクトリごとコピー
立ち上げ
docker-compose.ymlを配置したディレクトリにて以下コマンドでコンテナを立ち上げる.
$ docker compose up -d
http://192.168.XX.YY:8080 にアクセスして管理者アカウント作成画面が表示されることを確認する.
アカウント作成して進めると推奨アプリのインストール画面が表示される.
一旦は不要と考えてスキップ.後々必要になったら個別でインストールすることとする.
これで「こんばんは(こんにちは)」となってNextcloudが利用できるようになる.
設定
外部ストレージの追加
既にデータ保存されているHDDをNextcloudで参照できるようにするため,docker-composeでマウントしたディレクトリを外部ストレージとして設定する.
デフォルト状態では外部ストレージの設定は無効化状態のため,まず有効化する.
左上のユーザアイコンから「アプリ」を開く.
「無効なアプリ」の中に「External storage support」があるため有効にする.
これでユーザアイコン->管理者設定の中に「外部ストレージ」が追加される.
「ストレージを追加」で「ローカル」を選択するとローカルのディレクトリを指定するボックスが表示されるため,そこにdocke-composeで指定したマウント先(/mnt/external_hdd)を入力して保存する.
これでHDDの中身が見えるようになる.
「フォルダー名」はNextcloud上での表示名になるため適宜決める.
ビデオファイルのサムネイル表示
ビデオファイルはデフォルトではサムネイル表示非対応のため,追加で設定が必要となる.
/app/config
配下に配置されているconfig.phpの末尾を以下のように変更し,サムネイル表示させたい形式を指定することで対象のファイル形式のサムネイルが表示されるようになる.
サムネイル生成にはffmpegが必要になるため前述のDockerfileでインストールをしている.
<?php
$CONFIG = array (
~省略~
'enable_previews' => true,
'enabledPreviewProviders' =>
array (
0 => 'OC\\Preview\\Image',
1 => 'OC\\Preview\\Movie',
2 => 'OC\\Preview\\MKV',
3 => 'OC\\Preview\\MP4',
4 => 'OC\\Preview\\AVI',
5 => 'OC\\Preview\\MarkDown',
6 => 'OC\\Preview\\MP3',
7 => 'OC\\Preview\\TXT',
),
);
公式ドキュメント参考箇所
Configuration Parameters — Nextcloud latest Administration Manual latest documentation
おわりに
Nextcloudのdockerでの構築と,追加で実施した設定についてまとめた.
ログイン後のおすすめファイルの表示等,不要だと思うアプリもあるので色々有効化/無効化して試してみながら運用してみたい.
他に気になった点や情報に変更があった場合は随時更新していく.