NextcloudをDockerで構築してみたメモ

2022-03-14T12:30:00.000Z

はじめに

今回,友人から「Nextcloudを用いて外部からデータのやり取りをしたい」との相談があったので,そのときの手順について書きたいと思います。
記事内で使用したテンプレートリポジトリはこちらです。

要件

  • SSL化
  • データ保存場所などの設定を別ファイルで指定できること(.env的な感じ)
  • ある程度高速であること(実行ファイルをSSD / データをHDD)
  • ドメイン指定可能
  • スマホからアクセスできること
  • 自動起動


前提

既に以下の設定は終えているものとします。

  • Linuxのディストリビューションの初期設定が終わっていること
  • 80/443番のポート開放やFirewallの設定が終わっていること
  • データを保存するHDDがマウントされていること (記事内では /dev/data_hdd/としています)
  • データ保存ディレクトリに権限が追加されていること (www-data)


構成

全てDockerを使用して構築します。
コンテナはそれぞれ以下のとおりです。

db

Nextcloudのバックのデータベース用のコンテナです。今回はMariaDBを使用しました。
データボリュームは./db以下をbindしていますが,Dockerのボリュームでもよいと思います(なんなら多分そちらのほうが良い)。
環境変数はそれぞれ.envから読み込んでいます。

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


nextcloud

本体です。Nextcloudの公式イメージを使用しています。
データフォルダやコンフィグフォルダはそれぞれ.envに指定してあるものをバインドしています。

  nextcloud:
    image: nextcloud
    container_name: nextcloud
    links:
      - db
    volumes:
      - ${NEXTCLOUD_CONFIG_FOLDER}:/var/www/html
      - ${NEXTCLOUD_DATA_FOLDER}:/var/www/html/data/
    environment:
      - VIRTUAL_HOST=${DOMAIN_NAME}
      - LETSENCRYPT_HOST=${DOMAIN_NAME}
    restart: always


nginx-proxy

SSL化するために,Nginxのリバースプロキシのコンテナ + Let's EncryptでSSL化を行うacme-companionコンテナを用意します。

  nginx-proxy:
    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./proxy/conf:/etc/nginx/conf.d
      - ./proxy/vhost:/etc/nginx/vhost.d
      - ./proxy/html:/usr/share/nginx/html
      - ./certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./proxy/conf/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro
    environment:
      DEFAULT_HOST: ${DOMAIN_NAME}
      HTTPS_METHOD: noredirect
    links:
      - nextcloud
    depends_on:
      - nextcloud
    restart: always


acme-companion

こちらはLet's Encryptでドメイン認証をして,hostsに持ってきてくれるこちらのイメージを使用しています。
詳しい説明は該当イメージのREADME.mdを見てみてください。

  acme-companion:
    image: nginxproxy/acme-companion
    container_name: nginx-proxy-acme
    volumes_from:
      - nginx-proxy
    volumes:
      - ./certs:/etc/nginx/certs:rw
      - ./proxy/vhost:/etc/nginx/vhost.d
      - ./proxy/html:/usr/share/nginx/html
      - ./acme:/etc/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always


以上のdocker-compose.ymlを使用していきます。

DockerとDocker Composeのインストール

Docker公式サイトの手順を元にDockerと Docker Composeをインストールします。
https://docs.docker.com/engine/install/debian/

nextcloudが見れるようにデータフォルダに権限を追加

sudo chown -R www-data:www-data /mnt/data_hdd


テンプレートをGitHubからダウンロード

cd ~/
git clone https://github.com/seigo2016/nextcloud-docker-template.git


設定ファイル

フォルダ名はいい感じに。(以降記事内ではnextcloudとします)
設定ファイルをsedで,実行環境のドメイン名やIPアドレスに置き換えます。

mv nextcloud-docker-template フォルダ名
cd フォルダ名
DOMAIN=アクセスする際のドメイン
IP_ADDR=インストールしたPC/サーバーのIPアドレス
sed -i -e "s/{DOMAIN}/$DOMAIN $IP_ADDR localhost/" proxy/conf/proxy.conf


パスワードやデータフォルダを指定。

cp .env.example .env
vim .env 


.envの例です。

# nextcloud内のデータが保存されるフォルダ
NEXTCLOUD_DATA_FOLDER=/mnt/data_hdd/
# nextcloudのconfigフォルダ
NEXTCLOUD_CONFIG_FOLDER=./nextcloud
# DBのRootユーザーのパスワード
ENV_MYSQL_ROOT_PASSWORD=password1234
# DBのnextcloudユーザーのパスワード
ENV_MYSQL_PASSWORD=password1234
# ドメイン名
DOMAIN_NAME=example.com


初期設定

docker compose up -d

ここでブラウザからhttps://IPアドレスにアクセス (危険を承知で続行的なボタンをクリックしてアクセス)
アカウント作成からmysqlデータベースの設定まで支持に従って行います。

一定時間後503が出るはずですが,無視して次の工程へ進んでください。

設定変更

初回の起動で生成されたconfig.phpを環境に合わせてsedで修正していきます。

docker compose down
sudo chmod 766 nextcloud/config/config.php
DOMAIN=ドメイン

Nginxのリバースプロキシを使用しているので,そのアドレスを渡します。
今回のコンテナは同一のネットワークに所属しており,コンテナ名をホスト名としてアクセスすることができます。
ここではIPアドレスが必要ですので,PHPのgethostbynameを使用して変換し,変数に格納したものをtrusted_proxiesの設定項目に渡しています。

sudo sed -i -e '/<?php/a $PROXY_ADDR = gethostbyname("nginx-proxy");' nextcloud/config/config.php
sudo sed -i -e '/^);/i \ \'\''trusted_proxies'\'' => $PROXY_ADDR,' nextcloud/config/config.php
sudo sed -i -e '/^);/i \ \'\''overwriteprotocol'\'' => \'\''https\'\'',' nextcloud/config/config.php

ドメイン名についての設定も追記します。

sudo sed -i -e "/^\ \0 => /s/$/ "\'"$DOMAIN_NAME"\'",/" nextcloud/config/config.php


これらの設定を反映させるため,再生成します。

docker compose up -d

再度アクセスすればログインしてスマホからもWebからも閲覧・ダウンロード・アップロードできるはずです。

以上

テスト環境はDebian bullseye 2CPU メモリ8GBを使用しました。
途中強引にsedで置換しているのは,できるだけCLIエディタを使用しないようにしたためです。
慣れているなら普通にvimやnanoで書き換えたほうが楽だと思います。