はじめに
自宅サーバ上のNextcloudに自宅外からアクセスするため、独自ドメインとCloudflare Tunnelを使用して、httpsで接続できるように設定します。
- はじめに
- Cloudflareの登録
- cloudflaredのインストール
- Nextcloudの設定
- CloudflareのRocket Loader無効化
- Cloudflareでのリダイレクト設定
- Nextcloudへの接続確認
- 参考1:Cloudflare packagesリポジトリの追加
- 参考2:自宅内からの接続をプライベートIPに切り替え
以下のネットワーク構成図だと①の方法です。
先日紹介した上図②と③の方法は無料で実現できましたが、今回紹介する方法は独自ドメインの取得と更新に費用がかかります。1 ただ、今回の方法が運用の手間や性能面、接続の容易さなどで最もおすすめです。特に、既存のCloudflareユーザの場合は今回の方法一択だと思います。
前提として、以下の環境で作業します。
- 自宅サーバ: Ubuntu 22.04
- Nextcloud: snap版を使用して初期設定済
Cloudflareの登録
取得した独自ドメインをCloudflareに登録します。まだドメインを未取得の場合はCloudflare Resisterがおすすめです。Cloudflareとそのまま連携できますし、ドメインも原価で提供されていて良心的です。
具体的な登録方法についてはここでは省略します。
cloudflaredのインストール
自宅サーバにcloudflaredをインストールします。最新バージョンのインストール資材などは以下のページに記載されています。
$ wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb $ sudo apt install ./cloudflared-linux-amd64.deb $ sudo cloudflared tunnel login
コマンドを実行後、表示されたURLにアクセスし、認証します。Cloudflareのダッシュボード上で、登録したドメインを指定すれば完了です。
続いて、トンネルを作成します。[トンネル名]
は任意の名前を指定します。
$ sudo cloudflared tunnel create [トンネル名]
実行度、出力結果からCreated tunnel mattermost with id
より後ろの文字列(UUID)をコピーします。
コピーしたUUID
と、Nextcloudで使用するドメインをDNSに登録します。
$ sudo cloudflared tunnel route dns [UUID] xxxxx.yusukesakai.com
次に、設定ファイルを編集します。ここで、トンネルからのアクセスを自宅サーバのサービスと連携させます。
$ sudo nano /root/.cloudflared/config.yml
UUID
は先ほどの文字列に修正します。
tunnel: [UUID] credentials-file: /root/.cloudflared/[UUID].json ingress: - hostname: xxxxx.yusukesakai.com service: http://localhost:80 - service: http_status:404
最後に、cloudflaredをサービス登録して、systemctlでバックグラウンドでも動作するように設定します。
$ sudo cloudflared service install
$ sudo systemctl restart cloudflared
Nextcloudの設定
Nextcloudの設定を編集し、独自ドメインを信頼できるドメインとして追加します。
$ sudo nano /var/snap/nextcloud/current/nextcloud/config/config.php
trusted_domains
の設定項目を見つけて編集します。既にarray内に設定が存在する場合は、番号をカウントアップして追加します。
'trusted_domains' => array ( 0 => 'xxxxx.yusukesakai.com', ),
CloudflareのRocket Loader無効化
現状でもサイトに接続できますが、NextcloudとCloudflareのRocket Loaderという機能の相性が悪く、Rocket Loaderが有効だとNextcloudのJavaScriptが正常に動作しません。そこで、CloudflareのダッシュボードからRocket Loaderを無効化します。
Cloudflareのダッシュボードにログイン後、「ルール」から「構成ルール」を選択し、「ルールを作成」ボタンをクリックします。
適当なルール名を入力後、カスタムフィルタ式を選択し、フィールド:ホスト名、オペレーター:等しい、値:{今回のドメイン名}とします。
その後、設定内容から「Rocket Loader」で追加ボタンをクリックし、オフにします。
ページ下部の展開ボタンをクリックすれば完了です。
Cloudflareでのリダイレクト設定
現状でもサイトに接続できますが、Nextcloudの管理画面で表示される警告を回避するため、Cooudflareのダッシュボードからリダイレクトの設定を行います。
Cloudflareのダッシュボードにログイン後、「ルール」から「リダイレクト ルール」を選択し、「ルールを作成」ボタンをクリックします。
適当なルール名を入力後、カスタムフィルタ式を選択し、OR条件でフィールド:完全URI、オペレーター:等しい、値:{以下2つのアドレス}とします。
https://xxxxx.yusukesakai.com/.well-known/carddav
https://xxxxx.yusukesakai.com/.well-known/caldav
その後、実行内容として、タイプ:静的、URL:{以下のアドレス}、ステータスコード:301とします。
https://xxxxx.yusukesakai.com/remote.php/dav
ページ下部の展開ボタンをクリックすれば完了です。
Nextcloudへの接続確認
任意のブラウザまたはアプリからhttps://xxxxx.yusukesakai.com
にアクセスします。
無事にログインできれば成功です。お疲れさまでした。
参考1:Cloudflare packagesリポジトリの追加
必須ではないですが、cloudflaredをリポジトリからインストールする場合は、公式サイトに従って、以下のコマンドを実行します。
$ sudo mkdir -p --mode=0755 /usr/share/keyrings $ curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null $ echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main' | sudo tee /etc/apt/sources.list.d/cloudflared.list $ sudo apt update && sudo apt install cloudflared
基本的に公式サイトのとおりですが、リスト登録時にarch=amd64
を付与してないとエラーになるため、追加します。
参考2:自宅内からの接続をプライベートIPに切り替え
本記事の方法では、自宅内の機器から自宅サーバに接続する際も常にインターネット(Cloudflare Tunnel)経由となるため、通信速度が遅く、余計な帯域を使用します。
そこで、以下の記事で、自宅内であれば自動でプライベートIPアドレスに接続する方法を書きました。
- きちんと調べてないですが、Quick Tunnelsという機能を使えば、ドメインを持ってなくても、ランダムに生成されたURLで無料で公開できるらしい。すげえ。↩