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で書き換えたほうが楽だと思います。