Docker ComposeでNextcloudを構築する方法【完全ガイド】
はじめに
近年、クラウドストレージサービスの利用が一般的になっています。Google Drive, Dropbox, OneDriveといったサービスは便利ですが、プライバシーやセキュリティの観点から、自分自身でデータを管理したいと考える方も増えています。そこで登場するのが、オープンソースのセルフホスト型クラウドストレージソフトウェアである「Nextcloud」です。
Nextcloudは、ファイルストレージ機能だけでなく、カレンダー、連絡先、タスク管理、ビデオ会議など、オフィススイートに匹敵する多機能性を持っています。しかし、サーバーを用意してソフトウェアをインストールし、各種設定を行うのは、ある程度の技術的な知識が必要です。
そこで本記事では、DockerとDocker Composeを使ってNextcloudを簡単に、かつ堅牢に構築する方法を、約5000語の詳細なガイドとして解説します。Docker Composeを使うことで、Nextcloud本体、データベース、リバースプロキシ、キャッシュサーバーといった複数のコンポーネントをまとめて管理し、構築プロセスを効率化できます。
この記事を読むことで、以下のことが可能になります。
- DockerとDocker Composeの基本的な使い方を理解する。
- Nextcloudの各コンポーネントの役割と設定方法を学ぶ。
docker-compose.yml
ファイルの作成と理解。- HTTPS化された安全なNextcloud環境を構築する。
- 構築後の基本的な設定と運用方法を知る。
本ガイドは、Linuxの基本的な操作に慣れており、DockerおよびDocker Composeがインストールされたサーバー環境があることを前提としています。ドメイン名を取得し、DNS設定を行う方法についても簡単に触れますが、詳細は割愛します。
さあ、あなただけのプライベートクラウド環境をDocker Composeで構築しましょう。
前提条件
本ガイドを進めるにあたり、以下の環境と準備が必要です。
-
DockerおよびDocker Composeのインストール:
- NextcloudをデプロイするLinuxサーバー(Ubuntu LTSを推奨)にDockerとDocker Compose(v2以降、
docker compose
コマンドが使えるもの)がインストールされている必要があります。公式ドキュメントを参照してインストールしてください。 - Docker Engineインストールガイド
- Docker Composeインストールガイド
- 多くの場合、
apt install docker.io docker-compose-plugin
(Ubuntu/Debian) やyum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
(CentOS/RHEL) のようなコマンドでインストールできます。 - Dockerコマンドをsudoなしで実行できるように、ユーザーをdockerグループに追加しておくと便利です(
sudo usermod -aG docker your_username
)。変更を反映するには再ログインが必要です。
- NextcloudをデプロイするLinuxサーバー(Ubuntu LTSを推奨)にDockerとDocker Compose(v2以降、
-
Linuxサーバー:
- Nextcloudを稼働させるためのサーバーが必要です。物理サーバー、仮想マシン、VPS、クラウドインスタンスなど、種類は問いません。Nextcloudの推奨要件を満たすスペック(CPU、メモリ、ストレージ)を持つものが望ましいです。データ量に応じてストレージ容量は十分確保してください。
-
基本的なLinuxコマンド操作:
- ファイルやディレクトリの作成、編集、移動、パーミッション変更など、基本的なLinuxコマンド操作ができる必要があります。
-
ドメイン名(推奨):
- インターネット経由でアクセスする場合、独自のドメイン名(例:
cloud.your-domain.com
)を取得し、サーバーのグローバルIPアドレスまたはDNS名を指すようにDNSレコード(AレコードまたはAAAAレコード)を設定することを強く推奨します。これにより、後述するHTTPS化が容易になります。
- インターネット経由でアクセスする場合、独自のドメイン名(例:
-
SSHアクセス:
- サーバーにSSHで接続できる必要があります。
-
ファイアウォール:
- サーバーのファイアウォール(ufwなど)で、SSHポート(通常22)、HTTPポート(80)、HTTPSポート(443)へのアクセスを許可する必要があります。
本ガイドでは、Ubuntu LTSサーバーを使用していることを想定して説明を進めます。他のLinuxディストリビューションでも基本的な手順は同じですが、パッケージ管理コマンドなどが異なる場合があります。
NextcloudのDocker Compose構築の全体像
Docker Composeを使ってNextcloudを構築する際、いくつかのコンポーネントを組み合わせて動作させます。それぞれのコンポーネントは独立したDockerコンテナとして実行され、Docker Composeがそれらのライフサイクル(起動、停止、再起動など)や連携を管理します。
典型的なNextcloudのDocker Compose構成は、以下のコンポーネントから成り立ちます。
- Nextcloudコンテナ: Nextcloudのアプリケーション本体が動作するコンテナです。PHPやWebサーバー(ApacheまたはNginx)が含まれます。公式イメージを利用します。
- データベースコンテナ: Nextcloudのメタデータ(ファイル情報、ユーザー情報、権限設定など)を保存するためのデータベースサーバーです。MariaDBまたはPostgreSQLが推奨されます。本ガイドではMariaDBを例に進めます。
- リバースプロキシコンテナ: インターネットからのアクセスを受け付け、Nextcloudコンテナに転送する役割を担います。主にHTTPS終端、ロードバランシング(単一コンテナの場合は不要)、静的ファイルの配信、セキュリティヘッダーの付加などを行います。NginxまたはCaddyがよく使われます。本ガイドではNginxとCertbot(Let’s Encrypt用クライアント)を組み合わせる方法を詳細に解説します。
- キャッシュコンテナ (Redis): Nextcloudのパフォーマンスを向上させるために、ファイルロッキングやデータキャッシュに使われるインメモリデータストアです。大規模な環境や多数の同時アクセスがある場合は特に効果を発揮します。小規模な環境でも導入が推奨されています。
- Cronコンテナ: Nextcloudのバックグラウンドジョブ(ファイルスキャン、アクティビティ通知、クリーンアップなど)を定期的に実行するためのコンテナです。Nextcloud自体がcronを実行することも可能ですが、独立したコンテナとして管理する方が推奨されます。
これらのコンポーネント間の連携、データの永続化、外部からのアクセスを制御するために、docker-compose.yml
ファイル、Dockerネットワーク、Dockerボリュームを使用します。
docker-compose.yml
: Docker Composeの構成ファイルです。どのDockerイメージを使用するか、各コンテナの設定(ポートマッピング、ボリュームマウント、環境変数)、コンテナ間の依存関係、ネットワーク設定などをYAML形式で記述します。- Dockerネットワーク: デフォルトのブリッジネットワーク、またはユーザー定義のブリッジネットワークを使って、コンテナ間を安全に通信させます。リバースプロキシコンテナは外部ネットワーク(ホストのポート)と内部ネットワークの両方に接続します。
- Dockerボリューム: コンテナが削除されてもデータが失われないように、データベースファイルやNextcloudのユーザーデータ、設定ファイルなどをホストマシン上のディレクトリまたは名前付きボリュームに永続化します。
この構成により、各コンポーネントが独立して動作するため、アップデートや設定変更が容易になり、問題発生時の切り分けも行いやすくなります。
必要なコンポーネントの詳細と設定
各コンポーネントについて、Docker Composeで設定する際の詳細を見ていきます。
1. Nextcloudコンテナ
Nextcloudのアプリケーション本体をホストするコンテナです。
-
Dockerイメージ: 公式の
nextcloud
イメージを使用します。nextcloud:latest
または特定のバージョンタグ(例:nextcloud:27-fpm
)を選択できます。latest
は常に最新版ですが、予期せぬ変更がある可能性も考慮し、特定のバージョンタグ(特にfpm
タグ、リバースプロキシと組み合わせる場合に推奨)を指定することが多いです。本ガイドではnextcloud:27-fpm
(執筆時点での安定版の一つ)を例としますが、適宜最新の安定版に読み替えてください。fpm
タグは、NextcloudのPHP-FPMプロセスのみを含み、Webサーバー(ApacheやNginx)は含まれていません。リバースプロキシ(Nginxなど)がWebサーバーとして機能し、PHP処理をfpm
コンテナに委譲する構成となります。 -
ボリューム設定: 重要なデータや設定を永続化するために、以下のボリュームをマウントします。
/var/www/html
: Nextcloudのプログラムファイル、設定ファイルが配置されます。config/config.php
を含む重要なディレクトリです。/var/www/html/data
: ユーザーがアップロードしたファイルデータが保存されます。このディレクトリは特に容量を大きく確保する必要があります。- これらのボリュームは、名前付きボリューム (
nextcloud_html
,nextcloud_data
) またはホスト上のディレクトリ (./nextcloud/html
,./nextcloud/data
) としてマウントできます。名前付きボリュームの方がDockerによる管理が容易で推奨されます。
-
環境変数: Nextcloudコンテナは、環境変数を使ってデータベース接続情報や初期設定を受け取ります。
NEXTCLOUD_INIT_HOST
: (オプション)Nextcloudの初期設定を行う際のホスト名。リバースプロキシのアドレスを指定します。MYSQL_DATABASE
: 接続するデータベース名。MYSQL_USER
: データベース接続ユーザー名。MYSQL_PASSWORD
: データベース接続ユーザーのパスワード。MYSQL_HOST
: データベースコンテナのホスト名(Dockerネットワーク上のサービス名)。REDIS_HOST
: Redisコンテナのホスト名(Dockerネットワーク上のサービス名)。Redisを使用する場合に設定します。REDIS_HOST_PORT
: Redisのポート(通常6379)。REDIS_PASSWORD
: Redisにパスワードを設定している場合に指定。- その他、
OVERWRITEHOST
,OVERWRITEPROTOCOL
,OVERWRITEWEBROOT
などの設定も環境変数で可能です。リバースプロキシを使用する場合に重要になります。
-
依存関係: データベースコンテナとRedisコンテナが起動してからNextcloudコンテナを起動するように設定します。
depends_on
を使用します。
2. データベースコンテナ (MariaDB)
Nextcloudのメタデータを保存します。MariaDBを例に説明します。
-
Dockerイメージ:
mariadb:latest
または特定のバージョンタグを使用します。Nextcloudのバージョンと互換性のあるバージョンを選択してください。mariadb:10.11
などを推奨します。 -
ボリューム設定: データベースファイル自体を永続化するために、
/var/lib/mysql
ディレクトリを名前付きボリューム (db_data
) またはホスト上のディレクトリにマウントします。このボリュームのデータは非常に重要なので、必ず永続化してください。 -
環境変数: MariaDBの初期設定やユーザー設定を行います。
MYSQL_ROOT_PASSWORD
: rootユーザーのパスワード。本番環境では推測されにくい強力なパスワードを設定してください。MYSQL_DATABASE
: Nextcloudが使用するデータベース名。MYSQL_USER
: Nextcloudがデータベースに接続するために使用するユーザー名。MYSQL_PASSWORD
: 上記ユーザーのパスワード。こちらも強力なパスワードを設定してください。- これらの環境変数を設定することで、コンテナ起動時に指定されたデータベースとユーザーが作成されます。
-
パフォーマンス設定: 大規模な環境では、
my.cnf
ファイルをボリュームマウントしてデータベースのパフォーマンス設定(innodb_buffer_pool_size
など)を調整することを検討しても良いでしょう。小規模な環境ではデフォルト設定で十分なことが多いです。
3. リバースプロキシコンテナ (Nginx + Certbot)
インターネットからのアクセスを受け付け、HTTPS終端を行い、Nextcloudコンテナにリクエストを転送します。NginxとCertbotを組み合わせる方法を詳細に解説します。
Nginxコンテナ
-
Dockerイメージ:
nginx:latest
または特定のバージョンタグを使用します。 -
ボリューム設定: Nginxの設定ファイルと、Let’s Encryptの証明書を永続化するために、以下のボリュームをマウントします。
/etc/nginx/nginx.conf
または/etc/nginx/conf.d/default.conf
など: Nginxのメイン設定ファイルをホスト上の設定ファイルにマウントします。Nextcloudへのプロキシ設定やSSL設定を記述します。/var/www/certbot
: Certbotが証明書取得時にチャレンジ(HTTP-01)を検証するために使用するディレクトリです。ホスト上の空ディレクトリなどをマウントします。/etc/letsencrypt
: Certbotが取得した証明書や秘密鍵を保存するディレクトリです。ホスト上のディレクトリにマウントし、CertbotコンテナとNginxコンテナの両方からアクセスできるようにします。
-
ポートマッピング: 外部からのアクセスを受け付けるために、ホストマシンのポート80と443を、Nginxコンテナのポート80と443にマッピングします。
80:80
443:443
-
依存関係: NginxはNextcloudコンテナにアクセスする必要があるため、Nextcloudコンテナへの依存関係を設定します。
-
Nginx設定ファイル (
nginx.conf
またはdefault.conf
):- HTTP (ポート80) へのアクセスをHTTPS (ポート443) にリダイレクトする設定。
- HTTPS (ポート443) でのアクセス設定。
server_name
: Nextcloudにアクセスするドメイン名を指定します。ssl_certificate
とssl_certificate_key
: Let’s Encryptで取得した証明書と秘密鍵のパスを指定します。- SSL/TLS設定: 推奨される安全なプロトコルバージョン、暗号スイート、HSTS(HTTP Strict Transport Security)などを設定します。
location /
: Nextcloudコンテナへのプロキシ設定。proxy_pass
,proxy_set_header
,proxy_buffering off
などの設定が必要です。特にWebSocketが必要な機能(Talkなど)を使う場合は、WebSocket用のヘッダー設定 (Upgrade
,Connection
) も重要です。- 静的ファイルのキャッシュ設定。
- ファイルのアップロードサイズ制限 (
client_max_body_size
) の設定。
Certbotコンテナ
-
Dockerイメージ:
certbot/certbot
を使用します。 -
ボリューム設定:
/var/www/certbot
: Nginxコンテナと共有する、Certbotのチャレンジ検証用ディレクトリ。/etc/letsencrypt
: Nginxコンテナと共有する、証明書保存用ディレクトリ。
-
コマンド: コンテナ実行時に証明書を取得・更新するためのコマンドを実行します。
- 証明書取得コマンド例:
certonly --webroot -w /var/www/certbot -d your_domain.com --email [email protected] --agree-tos --no-eff-email
--webroot
: webroot認証方式を使用します。-w /var/www/certbot
: webrootディレクトリを指定します。-d your_domain.com
: 証明書を取得するドメイン名を指定します。--email [email protected]
: Let’s Encryptからの通知を受け取るメールアドレスを指定します。--agree-tos
: 利用規約に同意します。--no-eff-email
: EFFからのメールを受け取らない設定(任意)。
- 証明書取得コマンド例:
-
証明書の自動更新:
docker compose.yml
にCertbotコンテナを定義するのではなく、Certbotをスタンドアロンコンテナとして一度実行して証明書を取得し、その後はホストのcronやSystemd Timerなどで定期的に(例: 1ヶ月に一度)証明書更新コマンドを実行するのが一般的です。更新コマンドはcertbot renew
を使用し、Nginxの graceful reload も含める必要があります。
4. Redisコンテナ
Nextcloudのメモリキャッシュとファイルロッキングに使用されます。
-
Dockerイメージ:
redis:latest
または特定のバージョンタグを使用します。redis:alpine
など軽量なイメージも選択肢です。 -
ボリューム設定: Redisの設定ファイルや永続化(RDB/AOF、任意)を行う場合にボリュームをマウントします。キャッシュ用途であれば永続化は必須ではありませんが、設定ファイル (
redis.conf
) をマウントしてメモリ制限などを設定することは有用です。 -
環境変数: パスワードを設定する場合に
REDIS_PASSWORD
を使用します。 -
設定 (
redis.conf
, 任意):maxmemory
オプションでRedisが使用するメモリ量に上限を設定しておくと、ホストのリソース枯渇を防げます。maxmemory-policy noeviction
と組み合わせることで、メモリ上限に達した場合に新しい書き込み操作を拒否するようになります(キャッシュ用途ならallkeys-lru
など他のポリシーも適切)。
5. Cronコンテナ
Nextcloudのバックグラウンドジョブを実行します。
-
Dockerイメージ: Nextcloud公式イメージの
fpm
タグはcronを実行するためのスクリプト/cron.sh
を提供しています。これを実行するコンテナを作成します。image: nextcloud:27-fpm
(Nextcloudコンテナと同じイメージ)
-
ボリューム設定: Nextcloudのプログラムファイルや設定ファイルにアクセスできるように、Nextcloudコンテナと同じ
/var/www/html
ボリュームを読み取り専用でマウントします。 -
コマンド:
/cron.sh
スクリプトを定期的に実行するように設定します。Docker Composeでは、command: /cron.sh
と設定し、restart: on-failure
またはalways
としておくと、クラッシュしても再起動されます。実行間隔はDocker Composeでは直接制御できないため、別のツール(ホストのcronなど)からdocker compose exec nextcloud_cron_container /cron.sh
のように呼び出すか、コンテナ内部でcronデーモンを起動する(イメージによっては可能、ただし推奨されない場合も)といった方法があります。公式ドキュメントでは、独立したコンテナで/cron.sh
を実行する方法が推奨されています。docker compose
の設定だけでは定期実行にならないため、別途ホストのcronから呼び出す設定をします。- ホストのcron設定例:
crontab -e
を開き、以下の行を追加。
*/5 * * * * docker compose -f /path/to/your/docker-compose.yml exec --user www-data app php occ system:cron
この例では、app
というサービス名で定義されたNextcloudコンテナ内で、occ system:cron
コマンドを5分ごとに実行しています。--user www-data
は、Nextcloudが使用するWebサーバーユーザー(通常www-data
)としてコマンドを実行するためです。この方法が最も推奨されます。
独立したcronコンテナ (image: nextcloud:27-fpm
,command: /cron.sh
) を作成し、そのコンテナ内でocc system:cron
が実行されるように設定する方法もありますが、上記のようにホストのcronからexec
で実行する方が、cronジョブの実行状態をホスト側で管理しやすいため、より一般的です。本ガイドでは、ホストのcronからNextcloudコンテナのコマンドを実行する方法を前提とします。そのため、docker-compose.yml
には独立したCronコンテナは定義しませんが、Nextcloudコンテナ(サービス名app
とする)内で実行されるように設定します。
- ホストのcron設定例:
docker-compose.yml
ファイルの作成
これまでのコンポーネント詳細を踏まえ、docker-compose.yml
ファイルを作成します。ファイルは通常、サーバー上の任意のディレクトリ(例: /opt/nextcloud
)に配置します。
ディレクトリ構造の準備
Nextcloudのデータ、設定、Nginx設定、Let’s Encrypt証明書などを永続化するためのディレクトリ構造をホストマシン上に作成します。
“`bash
作業ディレクトリを作成
sudo mkdir /opt/nextcloud
sudo chown your_username:your_username /opt/nextcloud
cd /opt/nextcloud
データ、設定、証明書、Nginx設定用のディレクトリを作成
mkdir data config db_data certbot nginx
mkdir nginx/conf.d # Nginxの追加設定ファイル用
“`
your_username
は、Dockerコマンドを実行するユーザーのユーザー名に置き換えてください。
Nginx設定ファイルの作成
Nextcloud用のNginx設定ファイルを作成します。/opt/nextcloud/nginx/conf.d/nextcloud.conf
という名前で作成します。
“`nginx
/opt/nextcloud/nginx/conf.d/nextcloud.conf
upstream php-handler {
server app:9000; # Nextcloud PHP-FPMコンテナのサービス名とポート
}
server {
listen 80;
server_name your_domain.com; # あなたのドメイン名に置き換える
return 301 https://$host$request_uri; # HTTPをHTTPSにリダイレクト
}
server {
listen 443 ssl http2;
server_name your_domain.com; # あなたのドメイン名に置き換える
# Let's Encrypt証明書のパス
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
# セキュリティ関連のヘッダー
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Download-Options "noopen" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header Referrer-Policy "no-referrer" always;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always; # HSTS
# Nextcloudが推奨する設定
add_header Feature-Policy "autoplay 'none'; camera 'none'; geolocation 'none'; microphone 'none'; payment 'none'; usb 'none'";
add_header Permissions-Policy "autoplay=(), camera=(), geolocation=(), microphone=(), payment=(), usb=()";
# OCSP Stapling (証明書の検証高速化)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/your_domain.com/chain.pem; # 中間証明書
resolver 8.8.8.8 8.8.4.4 valid=300s; # OCSPレスポンダのDNS解決用 (Google Public DNSの例)
resolver_timeout 5s;
# SSL/TLSの設定
ssl_protocols TLSv1.2 TLSv1.3; # サポートするプロトコル
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # 推奨される暗号スイート
ssl_prefer_server_ciphers off; # クライアントの暗号スイート設定を優先しない
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# Diffie-Hellmanパラメータ (鍵交換を安全に)
ssl_dhparam /etc/ssl/certs/dhparam.pem; # 後述するDHパラメータファイル
# 静的ファイルの設定
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# assetsや.well-known/acme-challengeなどの設定
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot; # Certbotチャレンジ検証用ディレクトリ
try_files $uri =404;
}
location ^~ /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; }
location ^~ /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; }
# Nextcloudのメインロケーション
location / {
# Nextcloud公式ドキュメントの推奨設定を多く含む
# リバースプロキシ設定
proxy_pass http://php-handler;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
# WebSocketサポート (Talkなどが必要な場合)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# バッファリングをオフにすると、大容量ファイルのアップロードが改善される場合がある
proxy_request_buffering off;
proxy_buffering off;
proxy_redirect off;
# その他のプロキシ設定
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
# Nginxが静的ファイルを直接配信しないようにする設定(必要に応じて調整)
# location ~ \.(?:css|js|woff2?|svg|gif|png|jpe?g)$ {
# proxy_pass http://php-handler;
# expires 6M;
# access_log off;
# }
# Nextcloud index.php を隠す
rewrite ^/index.php/(.*) /$1 permanent;
# PHP-FPMへのFastCGI設定(proxy_passを使う場合は不要だが参考として)
# fastcgi_split_path_info ^(.+\.php)(/.*)$;
# include fastcgi_params;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# fastcgi_param PATH_INFO $fastcgi_path_info;
# fastcgi_param HTTPS on; # これを設定しないとNextcloudがHTTPSを認識しない場合がある
# fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # FPMソケットへのパス例
}
# エラーページ設定 (任意)
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
# アップロードファイルサイズ制限
client_max_body_size 10G; # 例: 10GB
}
“`
注意:
* your_domain.com
は実際に使用するドメイン名に置き換えてください。
* Let’s Encrypt証明書のパス (/etc/letsencrypt/live/your_domain.com/fullchain.pem
など) も、ドメイン名に合わせて修正してください。
* SSL/TLS設定、特にssl_ciphers
やssl_protocols
は定期的に最新の推奨設定を確認してください。Mozilla SSL Configuration Generatorなどが参考になります。
* ssl_dhparam
は、Diffie-Hellman鍵交換の安全性を高めるための設定です。サーバー上で以下のコマンドを実行して生成し、/opt/nextcloud/nginx
ディレクトリに dhparam.pem
という名前で保存します。
```bash
sudo openssl dhparam -out /opt/nextcloud/nginx/dhparam.pem 2048 # または 4096 (より安全だが時間かかる)
```
このファイルをNginxコンテナにボリュームマウントする必要があります。
.env
ファイルの作成 (機密情報管理)
データベースのパスワードなど、機密性の高い情報は.env
ファイルに記述し、docker-compose.yml
から参照するのが一般的な方法です。/opt/nextcloud/.env
ファイルを作成します。
“`env
/opt/nextcloud/.env
データベース設定
MYSQL_DATABASE=nextcloud_db
MYSQL_USER=nextcloud_user
MYSQL_PASSWORD=your_db_password_here # 安全なパスワードに変更
MYSQL_ROOT_PASSWORD=your_root_password_here # 安全なパスワードに変更
Redis設定 (パスワードを使う場合)
REDIS_PASSWORD=your_redis_password_here
Nextcloud設定 (任意 – config.phpの内容を上書き)
NEXTCLOUD_TRUSTED_DOMAINS=your_domain.com your_server_ip
NEXTCLOUD_OVERWRITEHOST=your_domain.com
NEXTCLOUD_OVERWRITEPROTOCOL=https
NEXTCLOUD_OVERWRITECLIURL=https://your_domain.com/
Let’s Encrypt設定
[email protected] # Let’s Encryptからの通知を受け取るメールアドレス
SERVER_NAME=your_domain.com # 証明書を取得するドメイン名
“`
your_db_password_here
, your_root_password_here
, [email protected]
, your_domain.com
は必ず実際のものに置き換えてください。これらの情報は外部に漏洩しないように厳重に管理してください。
docker-compose.yml
の作成
いよいよ docker-compose.yml
ファイルを作成します。/opt/nextcloud/docker-compose.yml
という名前で作成します。
“`yaml
/opt/nextcloud/docker-compose.yml
version: ‘3.8’ # Docker Composeファイルのバージョン
services:
# Nextcloud アプリケーションコンテナ
app:
image: nextcloud:27-fpm # または任意のバージョンタグ
container_name: nextcloud_app
restart: always # コンテナが停止した場合に常に再起動する
ports:
# 内部向けポートマッピング (リバースプロキシからのアクセス用)
# 外部に公開しない
– “9000” # PHP-FPMのデフォルトポート
volumes:
# Nextcloudのプログラム、設定、データディレクトリを永続化
- nextcloud_html:/var/www/html
- nextcloud_data:/var/www/html/data
# 設定ファイルディレクトリ(config/config.phpなどが含まれる)も永続化
# - nextcloud_config:/var/www/html/config # html全体を永続化するため不要な場合もあるが、明示的に分ける構成も可能
environment:
# データベース接続情報
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_HOST=db # データベースサービスのサービス名
# Redisキャッシュ設定
- REDIS_HOST=redis # Redisサービスのサービス名
- REDIS_HOST_PORT=6379
# - REDIS_PASSWORD=${REDIS_PASSWORD} # Redisにパスワードを設定した場合
# Nextcloud初期設定(任意)
# - NEXTCLOUD_INIT_HOST=${SERVER_NAME}
# リバースプロキシ環境での設定(重要)
- OVERWRITEHOST=${SERVER_NAME}
- OVERWRITEPROTOCOL=https
# - OVERWRITECLIURL=https://${SERVER_NAME}/ # occコマンド実行時に使用
depends_on:
- db # dbサービスが起動してからappサービスを起動
- redis # redisサービスが起動してからappサービスを起動
# Cronジョブ設定(ホストのcronから実行する場合は不要。もしコンテナ内で実行するなら以下の設定)
# command: /cron.sh
# environment:
# - NEXTCLOUD_CRON_ENV=docker
# MariaDB データベースコンテナ
db:
image: mariadb:10.11 # または任意のバージョンタグ
container_name: nextcloud_db
restart: always
command: –transaction-isolation=READ-COMMITTED –binlog-format=ROW –innodb-file-per-table=1 –skip-innodb-read-only-compressed # Nextcloud推奨のMariaDB/MySQL設定
volumes:
# データベースファイルを永続化
– db_data:/var/lib/mysql
environment:
# データベース初期設定
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # ルートパスワード
- MYSQL_DATABASE=${MYSQL_DATABASE} # Nextcloud用データベース名
- MYSQL_USER=${MYSQL_USER} # Nextcloud用ユーザー名
- MYSQL_PASSWORD=${MYSQL_PASSWORD} # Nextcloud用ユーザーパスワード
# Redis キャッシュコンテナ
redis:
image: redis:latest # または redis:alpine など
container_name: nextcloud_redis
restart: always
# environment:
# – REDIS_PASSWORD=${REDIS_PASSWORD} # パスワードを設定する場合
# volumes:
# Redisデータの永続化(キャッシュ目的なら必須ではない)
# – redis_data:/data
# command: redis-server –requirepass ${REDIS_PASSWORD} # パスワードを設定してRedisを起動する場合
# Nginx リバースプロキシコンテナ
web:
image: nginx:latest
container_name: nextcloud_web
restart: always
ports:
# 外部に公開するポート
– “80:80”
– “443:443”
volumes:
# Nginx設定ファイルのマウント
- ./nginx/conf.d/nextcloud.conf:/etc/nginx/conf.d/default.conf:ro # ホストの設定ファイルをコンテナのデフォルト設定としてマウント
# DHパラメータファイルのマウント (生成済みであること)
- ./nginx/dhparam.pem:/etc/ssl/certs/dhparam.pem:ro
# Let's Encrypt証明書とチャレンジ検証ディレクトリ
- certbot_www:/var/www/certbot # certbotサービスと共有
- certbot_conf:/etc/letsencrypt # certbotサービスと共有
depends_on:
- app # appサービスが起動してからwebサービスを起動
# Certbot コンテナ (Let’s Encrypt証明書取得・更新用)
certbot:
image: certbot/certbot
container_name: nextcloud_certbot
# 証明書取得・更新用のコマンドは手動またはホストのcron/Systemd Timerで実行
# デフォルトでは実行しないようにentrypointをオーバーライド
entrypoint: “trap exit TERM; while :; do certbot renew –noninteractive –post-hook ‘nginx -s reload’; sleep 12h & wait $$ ; done;” # 例: 12時間ごとに証明書更新を試行し、成功したらNginxをリロード
# または手動実行用にコマンドは空にしておく
# command: [“certbot”, “certonly”, “–webroot”, “-w”, “/var/www/certbot”, “-d”, “${SERVER_NAME}”, “–email”, “${CERTBOT_EMAIL}”, “–agree-tos”, “–no-eff-email”]
volumes:
# Nginxコンテナと共有するボリューム
- certbot_www:/var/www/certbot
- certbot_conf:/etc/letsencrypt
depends_on:
- web # Nginxが起動していないと証明書取得ができない場合があるため依存関係を設定 (チャレンジ検証に必要なポート80/443が利用可能である必要あり)
Docker Volumes 定義
volumes:
# Nextcloudデータ
nextcloud_html:
nextcloud_data:
# nextcloud_config: # html全体を永続化する場合は不要
# データベースデータ
db_data:
# Redisデータ (キャッシュ用途なら不要)
# redis_data:
# Certbot/Nginx 証明書とチャレンジ検証ディレクトリ
certbot_www:
certbot_conf:
ネットワーク定義 (オプション – デフォルトのブリッジネットワークでもOK)
networks:
nextcloud_network:
driver: bridge
“`
解説:
version: '3.8'
Docker Composeファイルのバージョンを指定します。services
: 実行するコンテナ(サービス)を定義します。app
(Nextcloud):nextcloud:27-fpm
イメージを使用。PHP-FPMプロセスが9000番ポートで待機します。volumes
でデータと設定を永続化。environment
でデータベースやRedisの接続情報を設定。depends_on
で依存関係を定義。db
(MariaDB):mariadb:10.11
イメージを使用。command
でNextcloud推奨のMariaDB設定を渡しています。volumes
でデータベースファイルを永続化。environment
でrootパスワード、データベース名、ユーザー、パスワードを設定。redis
(Redis):redis:latest
イメージを使用。Redisをキャッシュとして利用するためのコンテナ。web
(Nginx):nginx:latest
イメージを使用。ホストの80/443ポートをコンテナにマッピング。volumes
でNginx設定ファイル、DHパラメータファイル、Let’s Encrypt関連のファイルをマウント。depends_on
でapp
サービスに依存。certbot
:certbot/certbot
イメージを使用。Let’s Encrypt証明書を取得・更新します。volumes
でNginxと証明書関連のファイルを共有。entrypoint
で証明書更新を自動化していますが、初回証明書取得は手動で実行するか、初回実行時のみコマンドを指定する必要があります。 上記例では、自動更新を試みる設定になっています。volumes
: Docker管理の名前付きボリュームを定義します。これにより、コンテナのライフサイクルから独立してデータを管理できます。networks
: コンテナ間の通信を管理するネットワークを定義できますが、特別な理由がなければデフォルトのブリッジネットワークで十分です。
初回証明書取得コマンド
docker-compose.yml
でCertbotのentrypoint
を自動更新に設定している場合でも、初回起動時は証明書が存在しないため、一度手動で証明書を取得する必要があります。certbot
サービスの entrypoint
を一時的に以下のコマンドに変更して実行します。
“`yaml
certbot サービスの entrypoint を一時的に変更
docker-compose.yml 内
services:
certbot:
…
entrypoint: “certbot certonly –webroot -w /var/www/certbot -d ${SERVER_NAME} –email ${CERTBOT_EMAIL} –agree-tos –no-eff-email –force-renewal” # 初回実行時のみ force-renewal は不要だが安全のため含める
``
docker compose up certbotでCertbotコンテナを実行し、証明書を取得します。成功したら、
docker-compose.ymlの
entrypoint`を元に戻します。
あるいは、docker-compose.yml
は上記完全版のままとし、初回だけ別途コマンドを実行する方法もあります。
“`bash
初回のみ証明書を取得
sudo docker compose run –rm certbot certonly –webroot -w /var/www/certbot -d your_domain.com –email [email protected] –agree-tos –no-eff-email
``
certbot
このコマンドは、サービスを一度だけ実行し、成功したらコンテナを削除します (
–rm)。
your_domain.comと
[email protected]` は置き換えてください。実行前に、DNS設定が正しく行われ、ポート80がNginxコンテナによってリッスンされている必要があります。
証明書取得後、Nginx設定ファイル (/opt/nextcloud/nginx/conf.d/nextcloud.conf
) の証明書パスが正しいか確認してください。Let’s Encryptは通常 /etc/letsencrypt/live/your_domain.com/
以下に証明書を配置します。
Nextcloud構築の手順
必要なファイル (.env
, nginx/conf.d/nextcloud.conf
, docker-compose.yml
, nginx/dhparam.pem
) が準備できたら、いよいよ構築を開始します。
-
作業ディレクトリに移動:
bash
cd /opt/nextcloud -
Diffie-Hellmanパラメータファイルの生成:
bash
sudo openssl dhparam -out ./nginx/dhparam.pem 2048 # または 4096 -
.env
ファイルの編集:
作成した.env
ファイルを開き、データベースパスワード、Let’s Encryptのメールアドレス、ドメイン名などを適切に設定します。 -
Nginx設定ファイルの編集:
作成したnginx/conf.d/nextcloud.conf
ファイルを開き、your_domain.com
を実際のドメイン名に置き換えます。SSL証明書のパスも確認してください。 -
docker-compose.yml
ファイルの編集:
必要に応じて、NextcloudやMariaDBのバージョンタグ、Redisのパスワード設定などを調整します。 -
初回証明書取得(重要):
Nginxコンテナを起動する前に、Let’s Encryptの証明書を取得する必要があります。以下のコマンドを実行します。your_domain.com
と[email protected]
は置き換えてください。bash
sudo docker compose run --rm certbot certonly --webroot -w /var/www/certbot -d your_domain.com --email [email protected] --agree-tos --no-eff-email
コマンドが成功すると、証明書ファイルが/opt/nextcloud/certbot_conf/live/your_domain.com/
以下に保存されます。Nginx設定ファイルで指定したパスと一致しているか確認してください。 -
Docker Compose スタックの起動:
証明書が取得できたら、すべてのサービスを起動します。bash
sudo docker compose up -d
-d
オプションは、コンテナをバックグラウンドで実行するためのものです。初回起動時は、Dockerイメージのダウンロードなどが行われるため時間がかかります。 -
コンテナの起動確認:
コンテナが正しく起動しているか確認します。bash
sudo docker compose ps
すべてのサービスのState
がUp
になっていることを確認してください。 -
初期セットアップウィザードの実行:
Webブラウザを開き、設定したドメイン名(例:https://your_domain.com
)にアクセスします。Nextcloudの初期セットアップ画面が表示されるはずです。- 管理者アカウントを作成します。ユーザー名とパスワードを入力します。
- データベース設定が表示されます。
docker-compose.yml
と.env
ファイルで設定したデータベースユーザー、パスワード、データベース名、データベースホスト(サービス名のdb
)が自動的に入力されていることを確認します。ホストはdb
のままにします。 - 「ストレージ&データベース」の下にある「SQLiteではなくMySQL/MariaDBまたはPostgreSQLを使用する」にチェックが入っていることを確認し、データベース情報を入力します。
- 「セットアップを完了します」をクリックします。
初期セットアップには数分かかる場合があります。完了すると、Nextcloudのダッシュボード画面が表示されます。
-
Let’s Encrypt証明書自動更新の設定:
Certbotコンテナのentrypoint
を証明書自動更新コマンドに戻します。“`yaml
docker-compose.yml 内、certbot サービスの entrypoint を変更
services:
certbot:
…
entrypoint: “trap exit TERM; while :; do certbot renew –noninteractive –post-hook ‘nginx -s reload’; sleep 12h & wait $$ ; done;” # 例: 12時間ごとに証明書更新を試行し、成功したらNginxをリロード
``
docker compose up -d certbotを実行して、Certbotサービスを再起動し、変更を適用します。この設定により、Certbotコンテナがバックグラウンドで動作し続け、定期的に証明書の更新を試みるようになります。更新に成功した場合、
–post-hook`で指定したコマンド(Nginxのgraceful reload)が実行され、新しい証明書が反映されます。 -
Cronジョブの設定:
Nextcloudのバックグラウンドジョブを定期的に実行するために、ホストのcronを設定します。bash
sudo crontab -e
エディタが開いたら、以下の行を追加します。/opt/nextcloud
はdocker-compose.yml
ファイルが置かれているディレクトリのパスに置き換えてください。*/5 * * * * docker compose -f /opt/nextcloud/docker-compose.yml exec --user www-data app php occ system:cron
これにより、5分ごとにNextcloudコンテナ内でphp occ system:cron
コマンドがwww-data
ユーザーとして実行されます。
これで、基本的なNextcloud環境がDocker Composeで構築されました。
Nextcloudの初期設定と最適化
構築したNextcloud環境にログインし、いくつかの設定を確認・変更して最適化を行います。
-
管理者アカウントでログイン:
初期セットアップで作成した管理者アカウントでログインします。 -
管理画面へのアクセス:
画面右上のユーザーアイコンをクリックし、「設定」を選択します。左側のメニューで「管理」セクションにある「概要」をクリックします。 -
概要ページの確認:
このページには、Nextcloud環境に関する重要な情報や、推奨される設定に関する警告が表示されます。表示される警告を一つずつ確認し、対応します。- セキュリティ&セットアップの警告:
- HTTPS: リバースプロキシ(Nginx)とLet’s EncryptでHTTPS化されているか確認します。正しく設定されていれば警告は出ません。
- メモリキャッシュ: Redisが正しく設定されているか確認します。警告が出ている場合、
config/config.php
ファイルにRedisの設定を追加する必要があります。 - Cronジョブ: バックグラウンドジョブの実行方法がCronに設定されているか確認します。ホストのcrontabで設定していれば、警告は出ません。Cron以外の方法(AJAXやWebcron)が設定されている場合は、Cronに変更することを推奨します。設定は「管理」→「基本設定」ページで行えます。
- PHP OPcache: PHPのOPcacheが有効になっているか確認します。Dockerイメージでは通常デフォルトで有効です。
- 厳格なコード整合性チェック: ファイルの改変がないかチェックします。コンテナの起動時に実行されるため、通常は問題ありません。
- データベースインデックス: データベースに必要なインデックスが全て作成されているか確認します。警告が出ている場合は、
occ
コマンドでインデックスを作成する必要があります。 - メモリ制限: PHPのメモリ制限が十分か確認します。Nextcloudの推奨は512MB以上です。DockerイメージのPHP設定で調整されていることが多いですが、必要に応じて
config/config.php
でmemory_limit
を設定できます。 - PHPモジュール: 必要なPHPモジュールが全てインストールされているか確認します。Dockerイメージでは通常全て含まれています。
- セキュリティ&セットアップの警告:
-
メモリキャッシュ(Redis)の設定:
Redisをキャッシュとして使用するには、Nextcloudのconfig/config.php
ファイルに設定を追加する必要があります。まず、
config.php
ファイルの場所を確認します。これはnextcloud_html
ボリュームの/var/www/html/config/
ディレクトリにあります。“`bash
コンテナ内部のconfig.phpの場所を確認 (docker volume inspect nextcloud_html でホスト上のパスがわかる)
例: /var/lib/docker/volumes/nextcloud_html/_data/config/config.php
またはコンテナ内で編集 (一時的)
sudo docker compose exec –user www-data app nano /var/www/html/config/config.php
“`config.php
ファイルを開き、?>
の直前あたりに以下の設定を追加します。“`php
<?php
$CONFIG = array (
// … 既存の設定 …‘memcache.distributed’ => ‘\OC\Memcache\Redis’,
‘memcache.locking’ => ‘\OC\Memcache\Redis’,
‘redis’ => array(
‘host’ => ‘redis’, // Redisサービスのサービス名
‘port’ => 6379,
‘timeout’ => 0.0,
// ‘password’ => ‘${REDIS_PASSWORD}’, // Redisにパスワードを設定した場合
),
‘default_phone_region’ => ‘JP’, // 例: 日本// … その他の設定 …
);
“`設定ファイルを保存したら、Nextcloudの管理画面「概要」ページを再読み込みし、メモリキャッシュに関する警告が消えたか確認します。
-
Cronジョブの確認:
管理画面「基本設定」ページで、バックグラウンドジョブが「Cron」に設定されていることを確認します。ホストのcrontab設定が正しく機能していれば、定期的にCronが実行され、概要ページに警告は表示されなくなります。 -
信頼できるドメインの設定:
管理画面「概要」ページに「’trusted_domains’ にあなたのドメイン名を追加する必要があります。」という警告が出ている場合があります。これは、Nextcloudが受け付けるホスト名を制限するセキュリティ設定です。
config/config.php
ファイルを編集し、trusted_domains
配列にドメイン名を追加します。“`php
<?php
$CONFIG = array (
// … 既存の設定 …‘trusted_domains’ =>
array (
0 => ‘localhost’, // Docker内部からのアクセス用 (変更しない)
1 => ‘your_domain.com’, // あなたのドメイン名を追加
// 必要に応じて他のアクセス方法(IPアドレスなど)も追加
),// … その他の設定 …
);
``
.envファイルで
NEXTCLOUD_TRUSTED_DOMAINS環境変数を設定している場合、この設定が優先されることがあります。環境変数で設定するのがよりDocker流です。
.envで設定した場合は、
config.php`での設定は不要です。 -
メールサーバーの設定:
パスワードリセット通知などに必要です。管理画面「基本設定」ページでSMTPサーバーなどの設定を行います。 -
推奨アプリの有効化:
管理画面「アプリ」ページで、Nextcloudが提供する様々な機能(カレンダー、連絡先、タスク、Talkなど)や、プレビュー生成などパフォーマンス関連のアプリを有効化できます。 -
その他のセキュリティ設定:
管理画面「セキュリティ」ページで、ログイン試行回数制限、CSP (Content Security Policy) などの設定を確認・調整できます。CSPの設定は、サードパーティ製のアプリやテーマを導入した際に問題になることがあるため、注意が必要です。
これらの設定を行うことで、Nextcloud環境はより安全かつ快適に利用できるようになります。
運用とメンテナンス
Nextcloud環境を安定して運用するために、いくつかのメンテナンス作業が必要です。
1. アップデート方法
Nextcloud本体、Dockerイメージ、OSなど、様々なレイヤーのアップデートが必要です。
-
Nextcloud本体のアップデート:
- Nextcloudは、新しいバージョンがリリースされると管理画面の「概要」ページに通知が表示されます。
- Docker版Nextcloudの場合、アップデートは新しいバージョンのDockerイメージを使用することで行います。
-
手順:
- 現在のNextcloudのバージョンを確認し、新しいバージョンとの差を確認します。メジャーバージョンアップの場合は注意が必要です。
docker-compose.yml
ファイルを開き、app
サービスのimage
タグを新しいバージョンに変更します(例:nextcloud:28-fpm
)。データベースやRedisなどのイメージも必要に応じて更新を検討します。- Nextcloudをメンテナンスモードに切り替えます。
bash
sudo docker compose exec --user www-data app php occ maintenance:mode --on - コンテナを停止・削除し、新しいイメージで再作成します。
bash
sudo docker compose down
sudo docker compose up -d - Nextcloudが起動したら、Webブラウザでアクセスし、アップデート処理が自動で実行されるか確認します。または、以下のコマンドで手動でアップデートを実行します。
bash
sudo docker compose exec --user www-data app php occ upgrade - アップデートが完了したら、メンテナンスモードを解除します。
bash
sudo docker compose exec --user www-data app php occ maintenance:mode --off - 管理画面の「概要」ページで、バージョンが更新され、警告が出ていないか確認します。
-
注意: メジャーバージョンアップ(例: 27 -> 28)を行う前に、必ず公式のアップグレードガイドを確認し、互換性や必要な手順を理解してください。また、アップデート前に必ずバックアップを取得してください。
-
Dockerイメージのアップデート:
- Nextcloudだけでなく、MariaDB, Redis, Nginx, CertbotなどのDockerイメージも定期的に最新版に更新することを推奨します。セキュリティパッチやバグ修正が含まれている可能性があります。
- 手順:
- 各サービスの
image
タグをlatest
にするか、新しい特定のバージョンタグに変更します。 docker compose pull
コマンドで新しいイメージをダウンロードします。
bash
sudo docker compose pulldocker compose up -d
コマンドを実行します。新しいイメージがダウンロードされていれば、関連するコンテナが再作成・再起動されます。
- 各サービスの
-
ホストOSのアップデート:
- Dockerやその他のソフトウェアが依存するホストOSも定期的にセキュリティアップデートを適用してください。
2. バックアップ戦略
Nextcloudのデータは非常に重要です。定期的なバックアップは必須です。バックアップすべきデータは主に以下の2つです。
- Nextcloudデータディレクトリ: ユーザーがアップロードしたファイル、サムネイル、暗号化キー(もし有効な場合)などが含まれます。これは
nextcloud_data
ボリュームに保存されています。 - Nextcloudデータベース: ファイルメタデータ、ユーザー情報、共有設定、アプリ設定など、Nextcloudの全ての状態情報が保存されています。これは
db_data
ボリュームに保存されています。 - Nextcloud設定ファイル:
config/config.php
ファイルは環境固有の設定が含まれるため、バックアップしておくと復旧が容易です。これはnextcloud_html
ボリュームの一部として保存されています。
バックアップ手順例:
バックアップを取得する際は、Nextcloudをメンテナンスモードにして、サービスを停止するか、少なくともファイル操作とデータベース操作が停止した状態で行うのが最も安全です。
- メンテナンスモードへの切り替え:
bash
sudo docker compose exec --user www-data app php occ maintenance:mode --on -
データベースのバックアップ:
mysqldump
コマンドを使用して、データベースをファイルにエクスポートします。“`bash
ホスト上の任意の場所にバックアップファイルを保存するディレクトリを作成
mkdir /opt/nextcloud/backup
MariaDBコンテナ内で mysqldump を実行し、標準出力をホストにリダイレクト
sudo docker compose exec db mysqldump -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} > /opt/nextcloud/backup/nextcloud_db_$(date +%Y%m%d).sql
``
{MYSQL_USER},
{MYSQL_PASSWORD},
{MYSQL_DATABASE}は
.envファイルの値に置き換えるか、上記コマンドを実行する前に環境変数としてエクスポートしてください。
$(date +%Y%m%d)` はバックアップファイル名に日付を含めるためのものです。 -
Nextcloudデータディレクトリのバックアップ:
rsync
やtar
などのツールを使用して、nextcloud_data
ボリュームの中身をバックアップ先にコピーします。nextcloud_data
ボリュームがホスト上の/var/lib/docker/volumes/nextcloud_data/_data
にマッピングされていると仮定します。“`bash
データのバックアップ
sudo rsync -a /var/lib/docker/volumes/nextcloud_data/data /opt/nextcloud/backup/nextcloud_data$(date +%Y%m%d)
``
rsyncは差分バックアップに便利です。必要に応じて圧縮 (
-z) や削除 (
–delete`) オプションを追加します。 -
config.phpのバックアップ:
nextcloud_html
ボリュームの/var/www/html/config/config.php
をバックアップします。bash
sudo cp /var/lib/docker/volumes/nextcloud_html/_data/config/config.php /opt/nextcloud/backup/config_$(date +%Y%m%d).php -
メンテナンスモードの解除:
バックアップが完了したら、メンテナンスモードを解除します。bash
sudo docker compose exec --user www-data app php occ maintenance:mode --off
自動バックアップ:
これらの手順をスクリプト化し、ホストのcronやSystemd Timerで定期的に実行するように設定することを推奨します。
バックアップ先の検討:
バックアップファイルは、元のサーバーとは別の場所に保存することが非常に重要です。別のサーバー、外部ストレージ、オブジェクトストレージサービス(S3など)への転送を検討してください。
3. ログの監視
コンテナのログを監視することで、問題発生を早期に検知できます。
- すべてのコンテナのログ:
bash
sudo docker compose logs - 特定のコンテナのログ:
bash
sudo docker compose logs app # Nextcloudコンテナのログ
sudo docker compose logs db # データベースコンテナのログ
sudo docker compose logs web # Nginxコンテナのログ
-f
オプションでリアルタイムにログを追跡できます。
4. ディスク容量の監視
Nextcloudのデータディレクトリ(nextcloud_data
ボリューム)は時間とともに増加します。ホストマシンのディスク容量を定期的に監視し、必要に応じて拡張してください。Dockerボリュームの容量は docker volume inspect <volume_name>
で確認できますが、実際のデータ量はホスト上のマッピング先ディレクトリを確認する方が確実です。
5. パフォーマンスチューニング
基本的な構成でも十分に動作しますが、ユーザー数やデータ量が増えるとパフォーマンスが課題になることがあります。
- Redisキャッシュ: メモリキャッシュを有効化することは必須のチューニングです。
- データベース: MariaDB/MySQLのパフォーマンス設定(
innodb_buffer_pool_size
など)を調整することで、データベースの応答性能が向上します。これらの設定はmy.cnf
ファイルをボリュームマウントして行います。 - PHP-FPM: PHP-FPMのワーカープロセス数などを調整します。これはNextcloud FPMイメージの設定を調整することになります。
- Nginx: 静的ファイルのキャッシュ設定などを最適化します。
- Preview Generator: 画像などのサムネイル生成はリソースを消費します。Preview Generatorアプリを導入し、非同期処理や事前生成を設定することでユーザー体験が向上します。
- Hardware Acceleration: CPU負荷が高い場合は、ハードウェアアクセラレーション(例: Intel Quick Sync Video)を利用できるPreview GeneratorやTranscodingアプリの導入を検討します。
トラブルシューティング
Nextcloud構築や運用中に発生しやすいトラブルとその解決策です。
-
コンテナが起動しない:
docker compose ps
でコンテナの状態を確認します。Exit
状態になっている場合は、docker compose logs <service_name>
でログを確認し、エラーメッセージから原因を特定します。- ポート競合、ボリュームマウントのエラー、環境変数の設定ミス、設定ファイルの内容誤りなどが原因として考えられます。
-
データベース接続エラー:
- Nextcloudコンテナ (
app
) のログを確認します。Can't connect to database
のようなエラーが出ていないか確認します。 docker compose exec db mysql -u <user> -p<password> -h db
のようにして、Nextcloudコンテナからデータベースに接続できるかテストします。.env
ファイルやdocker-compose.yml
で設定したデータベース名、ユーザー名、パスワード、ホスト名(サービス名のdb
)が正しいか再確認します。- データベースコンテナ (
db
) のログも確認し、起動時のエラーがないか確認します。
- Nextcloudコンテナ (
-
リバースプロキシの設定ミス (502 Bad Gateway, 403 Forbiddenなど):
- Webサーバー (
web
) のログ (docker compose logs web
) を確認します。Nginxのエラーログは通常/var/log/nginx/error.log
に出力されます(コンテナ内のパス)。 502 Bad Gateway
は、NginxがNextcloud FPMコンテナ (app
) に接続できない場合に発生しやすいです。docker-compose.yml
のproxy_pass http://app:9000;
のサービス名やポートが正しいか、app
コンテナが起動しているか確認します。Dockerネットワーク内でサービス名 (app
) で名前解決できているかも確認します。403 Forbidden
やファイルが見つからないエラーは、Nginx設定ファイルのroot
やlocation
ディレクティブ、ボリュームマウントの設定ミスが原因として考えられます。- HTTPSでアクセスできない場合は、ファイアウォールで443ポートが解放されているか、NginxのSSL設定が正しいか確認します。
- Webサーバー (
-
ファイルのアップロードに関する問題:
- アップロードサイズ制限に達している可能性があります。Nginx設定ファイル (
client_max_body_size
) と、必要であればNextcloudのconfig/config.php
(upload_max_filesize
,post_max_size
) の設定を確認・調整します。 - データディレクトリ (
nextcloud_data
ボリューム) の容量が不足しているか、パーミッションが正しくない可能性も考えられます。 - PHPのメモリ制限 (
memory_limit
) が不足している可能性もあります。
- アップロードサイズ制限に達している可能性があります。Nginx設定ファイル (
-
パーミッションエラー:
- Nextcloudは、データディレクトリや設定ファイルに特定のパーミッションを要求します。Dockerコンテナの場合、通常Nextcloudプロセスは
www-data
ユーザーで実行されます。永続化ボリュームをホスト上のディレクトリにマウントする場合、ホスト側のディレクトリの所有者とパーミッションを調整する必要がある場合があります(例:chown -R www-data:www-data /opt/nextcloud/data
)。名前付きボリュームを使用する場合は、Dockerがパーミッションを管理するため、通常この問題は発生しにくいです。
- Nextcloudは、データディレクトリや設定ファイルに特定のパーミッションを要求します。Dockerコンテナの場合、通常Nextcloudプロセスは
-
Let’s Encrypt証明書関連:
- 証明書が取得できない: DNS設定が正しくサーバーのIPを指しているか、ファイアウォールでポート80/443が解放されているか確認します。Certbotコンテナのログを確認します。
- 証明書が更新されない: Certbotコンテナのログや自動更新設定(entrypointやcronjob)を確認します。Nginxの graceful reload が正しく実行されているかも重要です。
発展的な内容
さらにNextcloud環境を強化・拡張するためのアイデアです。
-
S3互換ストレージを外部ストレージとして利用:
- ユーザーデータ (
nextcloud_data
ボリューム) を、ホストのローカルディスクではなく、MinIOなどのセルフホスト型S3互換ストレージや、AWS S3, Backblaze B2などのクラウドストレージに保存するように設定できます。これにより、Nextcloudサーバー自体のディスク容量の制約を受けなくなり、ストレージのスケーラビリティと可用性が向上します。Nextcloudの管理画面から「外部ストレージ」を設定します。
- ユーザーデータ (
-
OnlyOfficeまたはCollabora Onlineとの連携:
- NextcloudにOfficeスイート機能を統合し、ブラウザ上でドキュメント、スプレッドシート、プレゼンテーションを共同編集できるようになります。これらの機能は通常、OnlyOffice Document ServerまたはCollabora Online Development Edition (CODE) という別のサーバー(またはDockerコンテナ)を構築し、Nextcloudから連携させます。これらもDocker Composeで構築可能です。
-
LDAP/AD連携:
- 既存のActive DirectoryやLDAPサーバーと連携させ、ユーザー認証やグループ管理を一元化できます。Nextcloudの管理画面から設定します。
-
多要素認証 (MFA) の設定:
- アカウントのセキュリティを強化するために、TOTP(Google Authenticatorなど)、ハードウェアキー、SMSなど、様々なMFA手段を設定できます。管理画面から有効化できます。
これらの発展的な内容は、本記事で紹介した基本的なDocker Compose構成に、追加のサービスや設定を加えることで実現できます。
まとめ
本記事では、Docker Composeを使用してセルフホスト型クラウドストレージ「Nextcloud」を構築するための詳細なガイドを提供しました。Nextcloud本体、データベース、リバースプロキシ(Nginx+Certbot)、キャッシュ(Redis)といった主要なコンポーネントを独立したDockerコンテナとして構成し、docker-compose.yml
ファイルでこれらを統合管理する方法を学びました。
Docker Composeを使うことで、Nextcloud環境のセットアップが標準化され、繰り返し実行可能になり、各コンポーネントの管理やアップデートが容易になります。また、リバースプロキシによるHTTPS化とLet’s Encryptによる証明書の自動更新を設定することで、安全なリモートアクセス環境を構築できました。
構築後の初期設定、パフォーマンス最適化、そして定期的なアップデートやバックアップといった運用・メンテナンスの重要性についても解説しました。さらに、外部ストレージ連携やOfficeスイート連携など、Nextcloudをさらに活用するための発展的な内容にも触れました。
Nextcloudは非常に多機能なプラットフォームであり、本ガイドはその基本となる堅牢な基盤をDocker Composeで構築することに焦点を当てています。ここで構築した環境をベースに、あなたのニーズに合わせて機能を拡張し、プライベートクラウド環境を最大限に活用してください。
データの主権を取り戻し、安全で柔軟なクラウド環境を自分でコントロールする旅は、Docker Composeと共に始まったばかりです。この記事が、その素晴らしい旅の一助となれば幸いです。