DockerでNextcloud Hub(AIO)を構築:家族向けセルフホスト型クラウドストレージと共同作業環境

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

導入の背景と理由

4台のスマートフォンにある家族の写真・動画や個人データを保管するためだけに、我が家では2TBのGoogle Oneプラン2口とiCloudの有料プランを契約しており、毎月36ドル(年間430ドル以上)もの出費がかさんでいました。さらに厄介だったのは、データの散乱です。家の権利証のコピーや確定申告書類が必要になるたび、メールのスレッドやメッセージアプリを延々と掘り返さなければなりませんでした。また、商用クラウドプロバイダーがユーザーの個人データをAIモデルのトレーニングに利用していることにも不安を感じていました。

そこで、「家族の合格基準」を満たすプライベートな代替手段が必要になりました。バックグラウンドでのスムーズなカメラアップロード、軽快なフォトギャラリーの閲覧、ブラウザ上でのドキュメント編集、そして手軽なリンク共有ができることです。

通常のNextcloudをゼロから手動でデプロイしようとすると、本業並みの手間がかかりがちです。PHP-FPMのワーカープールをチューニングし、Redisのメモリ制限を調整し、PostgreSQLのアップグレードを管理し、Collaboraのソケット通信エラーをデバッグする羽目になります。アップストリームのリリースで依存関係が壊れようものなら、週末がまるごとフォーラムのトラブルシューティングで消し飛びます。

Nextcloud All-in-One(AIO)は、こうした運用管理の負担を一掃してくれます。Nextcloud公式によって直接メンテナンスされており、PostgreSQL 16、Redis、Apache、Collabora、BorgBackupといった専用のマイクロサービスコンテナ群を、軽量なスーパーバイザーデーモンが連携して統括します。

運用開始から6ヶ月が経ち、我が家のインスタンスではアクティブユーザー4人で1.4 TBのデータと約88,000枚の写真を管理しています。ソフトウェアのアップデートはWeb上のボタンを1つクリックするだけで5分で完了し、クラッシュやデータ同期の競合も一度も発生せず安定して稼働しています。

インストール手順

ハードウェア要件は非常に手頃です。筆者は余っていたHP EliteDeskのミニPC(Intel Core i5-8500T 6コア、DDR4 RAM 16 GB、ブート用256 GB NVMeドライブ、ファイルストレージ用の外付け4 TB Western Digital Red Plusドライブ)を活用しています。Docker EngineとDocker Composeが導入されたDebian 12またはUbuntu 22.04 LTSサーバーであれば、問題なくスムーズに動作します。

ルーターでポート80、443、8080をサーバーのローカルIPアドレス宛にポートフォワーディング(ポート開放)します。その後、DNSのAレコード(例: cloud.yourdomain.com)をご自宅のグローバルIPアドレスに向けます。

1. ディレクトリ構成の作成

Compose設定用の専用ディレクトリを作成します:

mkdir -p /opt/nextcloud-aio
cd /opt/nextcloud-aio

2. Docker Composeファイルの定義

docker-compose.yml ファイルを作成します。AIOのスーパーバイザーがワーカーコンテナを動的に起動・管理できるよう、Dockerソケットをバインドします。なお、マスターコンテナのポート一覧からポート443が意図的に除外されている点にご注意ください。スーパーバイザーが直接ポート443にバインドする専用の nextcloud-aio-apache コンテナを作成するためです:

services:
  nextcloud-aio-mastercontainer:
    image: nextcloud/all-in-one:latest
    init: true
    container_name: nextcloud-aio-mastercontainer
    restart: always
    ports:
      - "80:80"
      - "8080:8080"
    environment:
      - APACHE_PORT=443
      - APACHE_IP_BINDING=0.0.0.0
      - NEXTCLOUD_DATADIR=/mnt/storage/nextcloud_data
    volumes:
      - nextcloud_aio_mastercontainer:/mnt/docker-aio-config
      - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
  nextcloud_aio_mastercontainer:
    name: nextcloud_aio_mastercontainer

NEXTCLOUD_DATADIR には、実際のストレージのマウントポイント(ext4マウント、ZFSデータセット、専用RAIDアレイなど)を指定してください。

3. マスターコンテナの起動

スーパーバイザーデーモンを起動します:

docker compose up -d

コンテナの起動ログから初期セットアップ用のパスフレーズを取得します:

docker logs nextcloud-aio-mastercontainer

出力されたパスワードをコピーし、ブラウザで https://<サーバーのIPアドレス>:8080 にアクセスします。

初期設定

1. ドメイン検証とアドオンの選択

ポート8080へのアクセス時にブラウザに表示される自己署名証明書の警告を無視して進み、セットアップ用パスフレーズを入力して公開ドメイン名を送信します。マスターコンテナがポート80で一時的なACMEチャレンジ用リスナーを立ち上げ、ドメインの所有権を検証したうえで有効なLet’s Encrypt証明書を発行します。

検証が完了したら、環境に合わせて追加モジュール(アドオン)を選択します:

  • Nextcloud Office(Collabora Online): DOCX、XLSX、PPTXファイルをブラウザ上でリアルタイムに共同編集できます。
  • Imagick / Memories: サムネイルの高速キャッシュ。スマートフォンの4800万画素の写真をサクサクスクロールして閲覧したい場合には必須です。
  • Talk: 家族間の暗号化されたプライベートメッセージングおよびビデオ通話機能です。
  • ClamAV: アクセス時常駐型アンチウイルススキャナー。ClamAVのウイルス定義データベースだけで1.5 GB以上のRAMを消費するため、ホストに16 GB以上のRAMがない限りは無効にしておくことをおすすめします。

2. コンテナの起動と管理者アカウント情報

Start Containers をクリックします。マスターコンテナがPostgreSQL、Redis、Apache、Nextcloud Coreの検証済みイメージを取得し、依存関係の順序に従って各サービスを立ち上げます。一般的な100 Mbpsの家庭用回線であれば、この処理は約4分で完了します。完了後、画面に表示される管理者ログイン情報をすぐにパスワードマネージャーへコピーしてください。

3. セキュリティ強化とパフォーマンス調整

https://cloud.yourdomain.com にサインインし、管理設定 > 概要 で設定の警告がないか確認します。よくある地域設定の警告などは、occ コマンドラインから解消できます:

# 連絡先の電話番号を正しくフォーマットするために地域の電話コードを設定
docker exec --user www-data -it nextcloud-aio-nextcloud php occ config:system:set default_phone_region --value="US"

# 定期的なデータベースのインデックス作成とファイルクリーンアップを午前1:00にスケジュール
docker exec --user www-data -it nextcloud-aio-nextcloud php occ config:system:set maintenance_window_start --type=integer --value=1

もし家族が2 GBを超える4Kホームビデオを定期的にアップロードする場合は、Composeファイルのマスターコンテナの environment ブロックに PHP_UPLOAD_LIMIT=16G および PHP_MEMORY_LIMIT=2048M を追加してアップロード上限を引き上げてください。

4. クライアントの設定とモバイル自動アップロード

ユーザー 画面から、家族それぞれの個別アカウントと容量クォータ(例: 1人あたり250 GBなど)を作成します。各端末にGoogle PlayまたはiOS App StoreからNextcloudアプリをインストールしてもらいます:

  • カメラフォルダの自動アップロードを設定し、年・月ごとに整理するようにします。
  • バッテリー消費とモバイルデータ通信量を抑えるため、Wi-Fi接続時のみアップロードと充電中のみを有効にします。
  • Nextcloud App StoreからコミュニティアプリMemoriesをインストールします。標準のフォトビューアーがGoogleフォトに匹敵するUIに置き換わり、タイムラインの高速スクロール、顔認識、逆ジオコーディング(撮影場所の住所特定)などが利用可能になります。

動作確認とモニタリング

1. システム健全性の確認

起動したすべてのマイクロサービスが正常に稼働していることを確認します:

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

プロセス一覧に、nextcloud-aio-database、nextcloud-aio-redis、nextcloud-aio-apache、nextcloud-aio-collabora、nextcloud-aio-nextcloud のコンテナが健全(healthy)な状態で表示されていれば正常です。

2. ログの監視とCronジョブの実行確認

バックグラウンドタスクは、新着ファイルのインデックス作成、期限切れリンクの削除、プレビュー用サムネイルの生成などを行います。管理設定 > バックグラウンドジョブ を開き、スケジューラが Cron に設定されており、直近5分以内に実行されていることを確認してください。

リアルタイムの同期トランザクションを確認し、モバイル端末での同期エラーをリアルタイムで検知するには、次を実行します:

docker logs -f --tail=100 nextcloud-aio-nextcloud

3. 自動バックアップの検証

テストしていないバックアップは、ただの気休めに過ぎません。Nextcloud AIOにはBorgBackupによる暗号化スナップショット機能が標準で統合されています。AIOの管理画面(:8080)で、バックアップ先としてセカンダリの内蔵ハードディスクやNASのNFS共有を設定します。

コンテナのアップデートを実行する際、スーパーバイザーは自動的にトラフィックを一時停止し、PostgreSQLの整合性あるダンプを取得し、重複排除されたBorgスナップショットを作成した上でコンテナを再起動します。1.4 TBのデータセットでも、日次の差分バックアップは7分未満で完了します。スナップショットの履歴は、ターミナルからいつでも確認できます:

docker exec -it nextcloud-aio-borgbackup borg list /mnt/backup/borg

Nextcloud AIOへ移行したことで、毎月のサブスクリプション料金の支払いがなくなり、大切なプライベート文書を自分自身が物理的に管理するハードウェアへと取り戻すことができました。セットアップにかかった時間はひと晩だけで、定期的なアップデートも月5分程度で済み、家庭内ネットワークから暗号化されずにファイルが外部へ流出することもありません。

Share: