メインコンテンツまでスキップ

docker-compose で Nextcloud

· 約6分

投稿の内容

前回の投稿では、docker-compose と nginx を使ってリバースプロキシを実現する方法を紹介しまいた。この投稿では、前回構築したリバースプロキシの背後に Nextcloud を配置する方法を紹介します。

nginx の背後に Nextcloud を置くという方法は、Nextcloud の公式が docker-compose 使って既に公開しています。この公式が紹介している方法は、nginx-proxy という Docker イメージと acme-companion という Docker イメージを使って構築しています。nginx-proxy は、簡単にリバースプロキシを構築できる Docker イメージのようです。acme-companion は、Let's Encrypt を使って簡単に証明書を発行できる Docker イメージのようです。

この投稿では、上記の公式が紹介している方法ではなく、前回の投稿で構築したリバースプロキシを使います。これは公式と構成は同じですが、使っているイメージが違います。使っているイメージは、nginx と certbot の Docker イメージですね。nginx-proxy と違い、リバースプロキシの設定をした nginx.conf をイメージのビルドの際に置き換えています。

今回は、前回の構成を引き継ぎ、その構成に Nextcloud の追加します。nginx の背後に Nextcloud を置くという構成ですね。Nextcloud 自体は Apache 上で動作する 公式のDocker イメージ を採用します。

docker-compose.yml

早速、docker-compose.yml の内容を見ていきましょう。以下は 前回の投稿 の docker-compose.yml からの追加部分、つまり Nextcloud を構築する部分です。

  nextcloud:
# Nextcloudのapacheのイメージを使用する
image: nextcloud:25.0.2-apache

# 落ちても自動再起動する設定
restart: always

# nginx からアクセスできるようにホスト名を設定する
hostname: nextcloud

# あなたのドメインからアクセスする設定。
# 初回起動時にしかこの設定は効かないので注意が必要。
environment:
- NEXTCLOUD_TRUSTED_DOMAINS={your domain}
- OVERWRITECLIURL=https://{your domain}
- OVERWRITEPROTOCOL=https

# named volume を使ってデータを永続化
volumes:
- nextcloud:/var/www/html

# nginx と同じネットワークにする
networks:
- nginx-proxy

# ログの設定
logging:
driver: "json-file"
options:
max-size: "100k"
max-file: "10"

注意が必要なのは、環境変数 NEXTCLOUD_TRUSTED_DOMAINS です。これ無しで Nextcloud を起動すると trusted domain を設定してください的なメッセージが表示されました。なので、その後 NEXTCLOUD_TRUSTED_DOMAINS に自分のドメインを設定して再起動したのですが、やはり同じように trusted domain を設定してください的なメッセージが表示されました。いろいろ調べたところ、NEXTCLOUD_TRUSTED_DOMAINS は初回起動時にしか効かないようです。そこで Nextcloud のデータが保存してある /var/www/html (named volumeなのでホスト側の /var/lib/docker/volumes/{container}/_data/ ) を全て削除して再起動してみたところ上手くいきました。皆様もご注意ください。

さらに、Nextcloud のクライアントアプリからアクセスするためには、OVERWRITECLIURL と OVERWRITEPROTOCOL の設定もしなければなりません。これを設定しないと、クライアントから Nextcloud ログインすることができません。

nginx.conf

次に nginx 経由で Nextcloud にアクセスできるように nginx.conf を編集します。以下の server ディレクティブを追加します。

    server {
listen 443 ssl;

# リバースプロキシーの設定
server_name {your domain};

# リクエストのサイズ
client_max_body_size 10G;
proxy_request_buffering off;

# SSLの設定
ssl_certificate /etc/letsencrypt/live/{your domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{your domain}/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;

add_header Strict-Transport-Security "max-age=2592000" always;

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

location / {
# Nextcloud が起動しているコンテナへアクセスする
proxy_pass http://nextcloud:80/;
}
}

proxy_pass の設定は、Nextcloud が起動しているコンテナへアクセスするように設定します。Nextcloud のコンテナの設定で hostname を nextcloud に設定したので、nginx のコンテナからは http://nextcloud:80/ でアクセスできます。

その他の設定については、前回の投稿で紹介しているので、ここでは割愛します。

起動と停止

起動と停止は、前回の投稿 とほぼ同じですが、service に nextcloud を追加しています。

起動:

docker-compose up -d --build nginx nextcloud

停止:

docker-compose rm -fsv nginx nextcloud

今回は以上となります。