商用クラウドストレージの容量制限をきっかけに、自分でデータと認証情報を管理できるNextcloud環境を構築しました。現在は運用を終了していますが、アプリケーションだけでなくデータベース、永続化、リバースプロキシ、外部公開経路までを一つの構成として扱った記録を残します。

作った理由・当時の課題

商用クラウドストレージの容量って少ないですよね。大きいと定評のあるMEGAですら20GB。動画なんて置こうものなら1、2個で制限がきちゃう。そんな時に考えたのは保存領域を自分で管理でき、外出先からでも利用できる個人用の保存・共有環境を作る、いわゆるNAS(Network Attached Storage)の構築をすることにしました。

単にNextcloudを起動するだけでなく、データと認証情報を自分の管理下に置くこと、サーバーの待受ポートをインターネットへ直接公開しないことを要件にしました。特に私の環境に関しては、v6プラスネットワークを使用しているため特定ポートの解放ができないため、このような形式になりました。

使用環境

項目 内容
OS Ubuntu Server
アプリケーション Nextcloud
コンテナ Docker Compose
データベース MariaDB
リバースプロキシ Nginx
外部公開 Cloudflare Tunnel

実際の構成

Nextcloud本体とMariaDBを別々のコンテナとして起動し、ホスト側のNginxを経由してアクセスする構成にしました。外部からの接続にはCloudflare Tunnelを使用しました。

NextcloudとMariaDB

Nextcloud本体は公式イメージから起動し、ホスト側のNginxから到達できるポートへ接続しました。ユーザー情報やファイルのメタデータを保存するMariaDBは、Nextcloudとは別のコンテナとして管理しました。

Nextcloud本体とデータベースのデータは、それぞれ別のボリュームへ永続化しました。これにより、コンテナを作り直してもデータが残るようにしています。データベースの接続先や認証情報は環境変数から渡し、Compose内のサービス名でコンテナ同士を接続しました。

NginxとCloudflare Tunnel

サーバー側からCloudflareへトンネルを確立し、外部へ待受ポートを直接公開しない経路を作りました。Cloudflare TunnelからのアクセスはNginxで受け、Nextcloudコンテナへ転送しました。

公開経路をNginxへ集約することで、同じサーバー上で動かすほかのサービスと設定を分けて管理できるようにしました。

発生した問題と対処

運用停止後にこの記事を書いているので、問題の細かい部分までは覚えていませんが、当時遭遇したものをいくつかまとめておきます。

1.HTTPSなのに「HTTPSを使用してください」という警告が消えない

ブラウザから見ると完全にHTTPSで接続できているのに、Nextcloud側では「自分への接続はHTTP」と認識してしまう現象がありました。

Cloudflare Tunnelを使って、以下のような構成にしている場合に起こることがあるようです。

flowchart TD
    A[ブラウザ] -->|HTTPS| B[Cloudflare]
    B -->|Tunnel| C[cloudflared]
    C -->|HTTP| D["Nextcloud :80"]

ブラウザからCloudflareまではHTTPSなのですが、cloudflared からNextcloud本体まではHTTPで通信しています。

そのため、利用者から見るとHTTPSでも、Nextcloud自身からはHTTPでアクセスされているように見えてしまう、ということですね。

今回はDockerを使用して構築していたので、Nextcloud側に以下の設定を追加することで解決しました。

environment:
  - OVERWRITEPROTOCOL=https
  - OVERWRITECLIURL=https://cloud.example.com

OVERWRITEPROTOCOL=https を指定することで、Nextcloudに「外部からはHTTPSでアクセスされている」と認識させることができます。

最初はCloudflare側のHTTPS設定がおかしいのかと思っていましたが、実際にはCloudflareとNextcloudの間で認識がずれていた、という話でした。

2.容量が表示されない

これも当時、「Cloudflare Tunnelを使っている影響なのかな?」と勝手に思っていましたが、どうやらCloudflareはほとんど関係なかったようです。

Nextcloudでは、サーバーに搭載されているSSDやHDDの容量をそのままユーザーの使用可能容量として表示しているわけではなく、基本的にはユーザーごとに設定された Quota(容量制限) を基準に管理しています。

そのため、Quotaを「無制限」にしていたり、外部ストレージなど特殊な構成を使っていたりすると、総容量をうまく取得・表示できない場合があるようです。

例えば、サーバー側に2TBのストレージがあったとしても、Nextcloud側でQuotaを設定していなければ、必ずしも「○GB / 2TB」のように表示されるわけではありません。

なので、容量表示がおかしい場合はCloudflareを疑うよりも、

  • ユーザーのQuota設定
  • Nextcloudのデータ保存先
  • DockerのVolumeやbind mount
  • 外部ストレージの設定

あたりを確認した方がよさそうです。

当時はあまり深く調べないまま「なんか容量出ないな……」で終わらせてしまいましたが、ユーザーごとの容量設定やストレージ周りをちゃんと確認した上で運用することが大事ですね。

今ならこういうのもチャッピーに構成を投げて聞いた方が早いかもしれない。

3. Nextcloudの別機能(音声通話)がうまく使えない

Nextcloudにはファイル共有以外にもいろいろな機能があり、その中に「Nextcloud Talk」というチャット・音声通話機能があります。

正直、Nextcloudをこの用途で使っている人がどれくらいいるのかは分かりませんが、構築していた当時は「これ、DiscordやLINEみたいな使い方もできるんじゃないか?」と思い、とりあえず試していました。

チャットについては普通に使えたのですが、音声通話では少し問題がありました。

2人ならそれなりに通話できるのに、3人以上になると音声が不安定になるという現象です。

調べてみると、Nextcloudの画面表示やファイル共有、チャットと、Talkの音声通話では通信の仕組みが少し違いました。

通常のWeb画面やファイル共有はHTTP/HTTPSを中心に通信するため、Cloudflare Tunnel経由でも比較的扱いやすいです。一方、Nextcloud Talkの音声や映像には WebRTC が使われています。

少人数の通話では、基本的に参加者同士が直接通信します。

2人なら、

A ←→ B

だけなので比較的単純です。

しかし3人になると、

A ←→ B
↕    ↕
C ←──┘

のように、それぞれが複数の相手と通信することになります。当然、人数が増えるほど通信量や接続の負荷も増えていきます。

さらにWebRTCでは、NATやファイアウォールの影響で端末同士を直接接続できない場合があります。そのような通信を補助するために使われるのが STUN や TURN です。

特にTURNは、直接通信できなかった場合に音声や映像を中継してくれる仕組みです。

今回の環境ではNextcloud本体をCloudflare Tunnel経由で公開していましたが、Talk用のTURNサーバーまではきちんと構築していませんでした。

そのため、

Cloudflare Tunnel経由でNextcloudを公開していた TURNなどWebRTC用の通信環境を十分に用意していなかった 3人以上になることでP2P通信の負荷も増えた

といった要因が重なり、複数人での通話が不安定になっていた可能性が高そうです。

Nextcloud本体をCloudflare Tunnelで公開するだけなら、ファイル共有やWeb画面、チャットなどは普通に利用できます。ただ、Nextcloud Talkまで安定して使おうとすると、WebRTCやTURNについても別途考える必要があるというのは、実際に運用してみて初めて気づいた部分でした。

運用した結果

いくつか問題はありましたが、当初の目的だった「自分で管理できて、外出先からもアクセスできる保存・共有環境」は作ることができました。

特に、サーバーのポートを直接インターネットへ公開せず、Cloudflare Tunnel経由でNextcloudへアクセスできるようにしたことで、v6プラス環境でも外部から利用できる構成にできました。

また、Nextcloud本体とデータベースをDockerで分け、データについてはVolumeへ永続化することで、コンテナを作り直してもファイルやデータベースの内容が消えない構成にしました。

単純にNextcloudを起動するだけではなく、

インターネット
      ↓
Cloudflare
      ↓
Cloudflare Tunnel
      ↓
Nextcloud
      ↓
Database / Storage

という一連の構成を自分で組んで運用できたのは、かなり良い経験になったと思います。

現在の状態と振り返り

現在はNextcloudの運用を停止しており、NASや個人向けクラウドストレージとしては利用していません。

理由はいくつかありますが、実際に使ってみると、ファイルを保存するだけなら問題ないものの、Talkのような追加機能まで含めて使おうとすると別途設定が必要だったり、容量管理などNextcloud側の仕組みについても理解する必要があったりと、思っていた以上に管理する部分が多くありました。

そのため、このページは現在動いているサービスの紹介というよりも、

  • Dockerによるアプリケーション構築
  • データの永続化
  • データベースとの連携
  • Cloudflare Tunnelを使った外部公開
  • リバースプロキシ環境でのHTTPS設定
  • 実際に運用して発生した問題への対応

といったことを、自分で構築・運用した記録として残しています。

作ったサービスをずっと動かし続けることだけが運用ではなく、使わなくなったものを停止し、現在どういう状態なのかを残しておくことも運用の一部かなと思っています。

今後は「大容量のNASを作る」という用途にこだわらず、このサーバー自体は必要になったサービスをその都度動かせる環境として活用していく予定です。

参考資料

  • Nextcloud Administration Manual「Reverse proxy」

    • リバースプロキシ環境での overwriteprotocoloverwrite.cli.url について
  • Nextcloud Docker 公式ドキュメント「Using the image behind a reverse proxy」

    • OVERWRITEPROTOCOLOVERWRITECLIURL などDocker環境変数について
  • Nextcloud Administration Manual「User management / Setting storage quotas」

    • ユーザーごとのQuota設定や外部ストレージの容量計算について
  • Nextcloud Talk Documentation

    • STUN / TURNやNextcloud Talkの通話構成について
  • Cloudflare Docs「Cloudflare Tunnel / Routing」

    • Cloudflare Tunnelで利用できる通信方式や、HTTP以外のサービスを公開する場合の制約について