Docker ComposeでNextcloudを構築する方法【完全ガイド】

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で構築しましょう。

前提条件

本ガイドを進めるにあたり、以下の環境と準備が必要です。

  1. 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)。変更を反映するには再ログインが必要です。
  2. Linuxサーバー:

    • Nextcloudを稼働させるためのサーバーが必要です。物理サーバー、仮想マシン、VPS、クラウドインスタンスなど、種類は問いません。Nextcloudの推奨要件を満たすスペック(CPU、メモリ、ストレージ)を持つものが望ましいです。データ量に応じてストレージ容量は十分確保してください。
  3. 基本的なLinuxコマンド操作:

    • ファイルやディレクトリの作成、編集、移動、パーミッション変更など、基本的なLinuxコマンド操作ができる必要があります。
  4. ドメイン名(推奨):

    • インターネット経由でアクセスする場合、独自のドメイン名(例: cloud.your-domain.com)を取得し、サーバーのグローバルIPアドレスまたはDNS名を指すようにDNSレコード(AレコードまたはAAAAレコード)を設定することを強く推奨します。これにより、後述するHTTPS化が容易になります。
  5. SSHアクセス:

    • サーバーにSSHで接続できる必要があります。
  6. ファイアウォール:

    • サーバーのファイアウォール(ufwなど)で、SSHポート(通常22)、HTTPポート(80)、HTTPSポート(443)へのアクセスを許可する必要があります。

本ガイドでは、Ubuntu LTSサーバーを使用していることを想定して説明を進めます。他のLinuxディストリビューションでも基本的な手順は同じですが、パッケージ管理コマンドなどが異なる場合があります。

NextcloudのDocker Compose構築の全体像

Docker Composeを使ってNextcloudを構築する際、いくつかのコンポーネントを組み合わせて動作させます。それぞれのコンポーネントは独立したDockerコンテナとして実行され、Docker Composeがそれらのライフサイクル(起動、停止、再起動など)や連携を管理します。

典型的なNextcloudのDocker Compose構成は、以下のコンポーネントから成り立ちます。

  1. Nextcloudコンテナ: Nextcloudのアプリケーション本体が動作するコンテナです。PHPやWebサーバー(ApacheまたはNginx)が含まれます。公式イメージを利用します。
  2. データベースコンテナ: Nextcloudのメタデータ(ファイル情報、ユーザー情報、権限設定など)を保存するためのデータベースサーバーです。MariaDBまたはPostgreSQLが推奨されます。本ガイドではMariaDBを例に進めます。
  3. リバースプロキシコンテナ: インターネットからのアクセスを受け付け、Nextcloudコンテナに転送する役割を担います。主にHTTPS終端、ロードバランシング(単一コンテナの場合は不要)、静的ファイルの配信、セキュリティヘッダーの付加などを行います。NginxまたはCaddyがよく使われます。本ガイドではNginxとCertbot(Let’s Encrypt用クライアント)を組み合わせる方法を詳細に解説します。
  4. キャッシュコンテナ (Redis): Nextcloudのパフォーマンスを向上させるために、ファイルロッキングやデータキャッシュに使われるインメモリデータストアです。大規模な環境や多数の同時アクセスがある場合は特に効果を発揮します。小規模な環境でも導入が推奨されています。
  5. 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_certificatessl_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とする)内で実行されるように設定します。

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_ciphersssl_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_onappサービスに依存。
  • 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.ymlentrypoint`を元に戻します。

あるいは、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) が準備できたら、いよいよ構築を開始します。

  1. 作業ディレクトリに移動:
    bash
    cd /opt/nextcloud

  2. Diffie-Hellmanパラメータファイルの生成:
    bash
    sudo openssl dhparam -out ./nginx/dhparam.pem 2048 # または 4096

  3. .env ファイルの編集:
    作成した .env ファイルを開き、データベースパスワード、Let’s Encryptのメールアドレス、ドメイン名などを適切に設定します。

  4. Nginx設定ファイルの編集:
    作成した nginx/conf.d/nextcloud.conf ファイルを開き、your_domain.com を実際のドメイン名に置き換えます。SSL証明書のパスも確認してください。

  5. docker-compose.yml ファイルの編集:
    必要に応じて、NextcloudやMariaDBのバージョンタグ、Redisのパスワード設定などを調整します。

  6. 初回証明書取得(重要):
    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設定ファイルで指定したパスと一致しているか確認してください。

  7. Docker Compose スタックの起動:
    証明書が取得できたら、すべてのサービスを起動します。

    bash
    sudo docker compose up -d

    -d オプションは、コンテナをバックグラウンドで実行するためのものです。初回起動時は、Dockerイメージのダウンロードなどが行われるため時間がかかります。

  8. コンテナの起動確認:
    コンテナが正しく起動しているか確認します。

    bash
    sudo docker compose ps

    すべてのサービスの StateUp になっていることを確認してください。

  9. 初期セットアップウィザードの実行:
    Webブラウザを開き、設定したドメイン名(例: https://your_domain.com)にアクセスします。Nextcloudの初期セットアップ画面が表示されるはずです。

    • 管理者アカウントを作成します。ユーザー名とパスワードを入力します。
    • データベース設定が表示されます。docker-compose.yml.env ファイルで設定したデータベースユーザー、パスワード、データベース名、データベースホスト(サービス名の db)が自動的に入力されていることを確認します。ホストは db のままにします。
    • 「ストレージ&データベース」の下にある「SQLiteではなくMySQL/MariaDBまたはPostgreSQLを使用する」にチェックが入っていることを確認し、データベース情報を入力します。
    • 「セットアップを完了します」をクリックします。

    初期セットアップには数分かかる場合があります。完了すると、Nextcloudのダッシュボード画面が表示されます。

  10. 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)が実行され、新しい証明書が反映されます。

  11. Cronジョブの設定:
    Nextcloudのバックグラウンドジョブを定期的に実行するために、ホストのcronを設定します。

    bash
    sudo crontab -e

    エディタが開いたら、以下の行を追加します。/opt/nextclouddocker-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環境にログインし、いくつかの設定を確認・変更して最適化を行います。

  1. 管理者アカウントでログイン:
    初期セットアップで作成した管理者アカウントでログインします。

  2. 管理画面へのアクセス:
    画面右上のユーザーアイコンをクリックし、「設定」を選択します。左側のメニューで「管理」セクションにある「概要」をクリックします。

  3. 概要ページの確認:
    このページには、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.phpmemory_limitを設定できます。
      • PHPモジュール: 必要なPHPモジュールが全てインストールされているか確認します。Dockerイメージでは通常全て含まれています。
  4. メモリキャッシュ(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の管理画面「概要」ページを再読み込みし、メモリキャッシュに関する警告が消えたか確認します。

  5. Cronジョブの確認:
    管理画面「基本設定」ページで、バックグラウンドジョブが「Cron」に設定されていることを確認します。ホストのcrontab設定が正しく機能していれば、定期的にCronが実行され、概要ページに警告は表示されなくなります。

  6. 信頼できるドメインの設定:
    管理画面「概要」ページに「’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`での設定は不要です。

  7. メールサーバーの設定:
    パスワードリセット通知などに必要です。管理画面「基本設定」ページでSMTPサーバーなどの設定を行います。

  8. 推奨アプリの有効化:
    管理画面「アプリ」ページで、Nextcloudが提供する様々な機能(カレンダー、連絡先、タスク、Talkなど)や、プレビュー生成などパフォーマンス関連のアプリを有効化できます。

  9. その他のセキュリティ設定:
    管理画面「セキュリティ」ページで、ログイン試行回数制限、CSP (Content Security Policy) などの設定を確認・調整できます。CSPの設定は、サードパーティ製のアプリやテーマを導入した際に問題になることがあるため、注意が必要です。

これらの設定を行うことで、Nextcloud環境はより安全かつ快適に利用できるようになります。

運用とメンテナンス

Nextcloud環境を安定して運用するために、いくつかのメンテナンス作業が必要です。

1. アップデート方法

Nextcloud本体、Dockerイメージ、OSなど、様々なレイヤーのアップデートが必要です。

  • Nextcloud本体のアップデート:

    • Nextcloudは、新しいバージョンがリリースされると管理画面の「概要」ページに通知が表示されます。
    • Docker版Nextcloudの場合、アップデートは新しいバージョンのDockerイメージを使用することで行います。
    • 手順:

      1. 現在のNextcloudのバージョンを確認し、新しいバージョンとの差を確認します。メジャーバージョンアップの場合は注意が必要です。
      2. docker-compose.yml ファイルを開き、app サービスの image タグを新しいバージョンに変更します(例: nextcloud:28-fpm)。データベースやRedisなどのイメージも必要に応じて更新を検討します。
      3. Nextcloudをメンテナンスモードに切り替えます。
        bash
        sudo docker compose exec --user www-data app php occ maintenance:mode --on
      4. コンテナを停止・削除し、新しいイメージで再作成します。
        bash
        sudo docker compose down
        sudo docker compose up -d
      5. Nextcloudが起動したら、Webブラウザでアクセスし、アップデート処理が自動で実行されるか確認します。または、以下のコマンドで手動でアップデートを実行します。
        bash
        sudo docker compose exec --user www-data app php occ upgrade
      6. アップデートが完了したら、メンテナンスモードを解除します。
        bash
        sudo docker compose exec --user www-data app php occ maintenance:mode --off
      7. 管理画面の「概要」ページで、バージョンが更新され、警告が出ていないか確認します。
    • 注意: メジャーバージョンアップ(例: 27 -> 28)を行う前に、必ず公式のアップグレードガイドを確認し、互換性や必要な手順を理解してください。また、アップデート前に必ずバックアップを取得してください。

  • Dockerイメージのアップデート:

    • Nextcloudだけでなく、MariaDB, Redis, Nginx, CertbotなどのDockerイメージも定期的に最新版に更新することを推奨します。セキュリティパッチやバグ修正が含まれている可能性があります。
    • 手順:
      1. 各サービスの image タグを latest にするか、新しい特定のバージョンタグに変更します。
      2. docker compose pull コマンドで新しいイメージをダウンロードします。
        bash
        sudo docker compose pull
      3. docker compose up -d コマンドを実行します。新しいイメージがダウンロードされていれば、関連するコンテナが再作成・再起動されます。
  • ホストOSのアップデート:

    • Dockerやその他のソフトウェアが依存するホストOSも定期的にセキュリティアップデートを適用してください。

2. バックアップ戦略

Nextcloudのデータは非常に重要です。定期的なバックアップは必須です。バックアップすべきデータは主に以下の2つです。

  1. Nextcloudデータディレクトリ: ユーザーがアップロードしたファイル、サムネイル、暗号化キー(もし有効な場合)などが含まれます。これは nextcloud_data ボリュームに保存されています。
  2. Nextcloudデータベース: ファイルメタデータ、ユーザー情報、共有設定、アプリ設定など、Nextcloudの全ての状態情報が保存されています。これは db_data ボリュームに保存されています。
  3. Nextcloud設定ファイル: config/config.php ファイルは環境固有の設定が含まれるため、バックアップしておくと復旧が容易です。これは nextcloud_html ボリュームの一部として保存されています。

バックアップ手順例:

バックアップを取得する際は、Nextcloudをメンテナンスモードにして、サービスを停止するか、少なくともファイル操作とデータベース操作が停止した状態で行うのが最も安全です。

  1. メンテナンスモードへの切り替え:
    bash
    sudo docker compose exec --user www-data app php occ maintenance:mode --on
  2. データベースのバックアップ:
    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)` はバックアップファイル名に日付を含めるためのものです。

  3. Nextcloudデータディレクトリのバックアップ:
    rsynctar などのツールを使用して、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`) オプションを追加します。

  4. 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

  5. メンテナンスモードの解除:
    バックアップが完了したら、メンテナンスモードを解除します。

    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) のログも確認し、起動時のエラーがないか確認します。
  • リバースプロキシの設定ミス (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.ymlproxy_pass http://app:9000; のサービス名やポートが正しいか、app コンテナが起動しているか確認します。Dockerネットワーク内でサービス名 (app) で名前解決できているかも確認します。
    • 403 Forbidden やファイルが見つからないエラーは、Nginx設定ファイルの rootlocation ディレクティブ、ボリュームマウントの設定ミスが原因として考えられます。
    • HTTPSでアクセスできない場合は、ファイアウォールで443ポートが解放されているか、NginxのSSL設定が正しいか確認します。
  • ファイルのアップロードに関する問題:

    • アップロードサイズ制限に達している可能性があります。Nginx設定ファイル (client_max_body_size) と、必要であればNextcloudの config/config.php (upload_max_filesize, post_max_size) の設定を確認・調整します。
    • データディレクトリ (nextcloud_dataボリューム) の容量が不足しているか、パーミッションが正しくない可能性も考えられます。
    • PHPのメモリ制限 (memory_limit) が不足している可能性もあります。
  • パーミッションエラー:

    • Nextcloudは、データディレクトリや設定ファイルに特定のパーミッションを要求します。Dockerコンテナの場合、通常Nextcloudプロセスは www-data ユーザーで実行されます。永続化ボリュームをホスト上のディレクトリにマウントする場合、ホスト側のディレクトリの所有者とパーミッションを調整する必要がある場合があります(例: chown -R www-data:www-data /opt/nextcloud/data)。名前付きボリュームを使用する場合は、Dockerがパーミッションを管理するため、通常この問題は発生しにくいです。
  • 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と共に始まったばかりです。この記事が、その素晴らしい旅の一助となれば幸いです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール