投稿日:

DockerでNextcloud構築

はじめに

ロゴ

DockerでNextcloudを構築した際の作業メモ

構築時のポイント

  • 既にデータが保存されているHDDをNextcloudに接続し参照できるようにする
  • 各ユーザのデータディレクトリはシステムとは別のHDDに作成する
  • ビデオファイルのサムネイル表示ができるようにする
  • コンテナ内でcron実行ができるようにする

手順

docker関連ファイル準備

Nextcloud公式ページ

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

公式のサンプルを参考にして以下のように作成する.

dokcer-compose.yml
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
ENV_MYSQL_ROOT_PASSWORD=root
ENV_MYSQL_PASSWORD=root

Dockerfile

Githubにcron実行可能なコンテナを作成できるDockerfileのexampleがあるためそれを参考に作成する.
変更点として,ビデオファイルのサムネイル表示のためにffmpegを追加でインストールするようにしている(詳細は後述).

Dockerfile
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.conf
[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でインストールをしている.

config.php
<?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での構築と,追加で実施した設定についてまとめた.
ログイン後のおすすめファイルの表示等,不要だと思うアプリもあるので色々有効化/無効化して試してみながら運用してみたい.
他に気になった点や情報に変更があった場合は随時更新していく.