Docker+NextCloud+Cloudflare Tunnels

概要

タイトルの通り、Docker+NextCloud+Cloudflare Tunnelsの構成でホストした時のレシピを載せます。

Dockerで環境を汚さず、Cloudflare Tunnelsでポートを空けることもせず、Nextcloudをセルフホストする、というのが記事の趣旨です。それぞれの技術については詳しい人が詳しいことを、分かりやすく書いてくださっているのでそっちを読んだ方がいいです。

この記事の特筆するべき点は、合体させた、というその一点につきます。

特別なことは全くなく、BingAIに聞いたり公式Docsを読んだり記事を見たりしてやっただけです。が、背後https化の対応等、ちょっと躓いたところもあるので備忘録を兼ねて記事にします。

前提

  • Cloudflare Tunnelsの基本的な操作が分かること
  • docker-composeの基本的な操作が分かること
  • Ubuntuの基本的な操作が分かること(特にWebサーバ関連)

環境

  • Ubuntu 22.04.3 LTS
  • Docker version 20.10.24
  • sudoは省略してます(rootユーザーで操作しているため)

実作業

ステップ1

Cloudflare Tunnelsでトンネルを作ります。ドメインとアドレスはご自身の環境に合わせてください。ポートも好きにして良いですが、コピペで行くなら「8081」を指定します。

次にCloudflare TunnelsのOverviewタブ、Dockerコマンドをコピーします。

–token以後の英数字羅列をコピーしておきます。

ステップ2

Ubuntu上に適当なフォルダを作り、docker-compose.ymlを作って以下の文字をコピペします。<TOKEN>の所に、先ほどの英数字羅列を書いておきます。

8081じゃないポートを指定している場合はnextcloudのポートを変えておきます。

version: '3.9'
services:
  nextcloud-db:
    container_name: nextcloud-db
    image: mariadb
    restart: always
    volumes:
      - ./nextcloud-db:/var/lib/mysql
    environment:
      - MARIADB_ROOT_PASSWORD=nextcloud
      - MARIADB_PASSWORD=nextcloud
      - MARIADB_DATABASE=nextcloud
      - MARIADB_USER=nextcloud

  nextcloud:
    container_name: nextcloud
    image: nextcloud
    ports:
      - 8081:80
    volumes:
      - ./nextcloud:/var/www/html
      - /mnt:/mnt #外部ストレージ(ローカル)を使いたい場合はここにマウントするディレクトリを記載する。外付けHDDとか。
    restart: always
    environment:
      - MYSQL_HOST=nextcloud-db
      - MYSQL_PASSWORD=nextcloud
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
  tunnel:
    restart: always
    image: cloudflare/cloudflared
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=<TOKEN>

volumes:
  nextcloud-db:
  nextcloud:

ステップ3

nextcloudとnextcloud-dbフォルダを適当なフォルダの中に作ります。

そしたらフォルダを一つ上の階層にして、

chmod -R 755 <適当なフォルダ(<>は不要)>
chmod -R www-data:www-data <適当なフォルダ(<>は不要)>

を打って権限変更しておきます。

ステップ4

適当なフォルダの中にcdで戻ったら

docker-compose up -d

して動かします。

上手く動いたら、ブラウザにCloudflare TunnelsでPublic hostnamesに書いてたドメインを打ってアカウント作る画面にいきます。

しかし、何ちゃらってエラーが出ます。そしたら、

vi /nextcloud/config/config/config.php

で飛んで、

  'trusted_domains' =>
  array (
    0 => '<ブラウザに打ったドメイン(https://は不要、<>も不要)>',
  ),
  'overwrite.cli.url' => 'https://<ブラウザに打ったドメイン(<>は不要)>',

と、trusted_domainsとoverwrite.cli.urlを書き換えます。

※この後にまたここに来るのでステップ5を先に読んで修正入れておくのも手です。

後は適当なアカウントを作って、なんかそれっぽい画面が表示されたらひとまず完成です。

ステップ5

ただ、管理画面に飛ぶと色々エラーが表示されます。その先は(さして急ぎの修正でもないので)個別に対応すればいいです。

ただ、デスクトップソフトと連携してGoogleDrive風に使いたい(PCのフォルダ上でリアルタイム同期させたい)時は進行不能になる、という大きい問題があります。

具体的に言うと「ログインURLがHTTPSで始まっているにもかかわらず、ポーリングURLがHTTPSで始まっていません。セキュリティ上の問題がある可能性があるため、ログインできません。管理者に連絡してください」とか言われます。

あなたが(私が)管理者なので対応しましょう。

先ほどと同じように、

vi /nextcloud/config/config/config.php

して、今度は適当な行(私はoverwrite.cli.urlの下)に、

  'overwriteprotocol' => 'https',

を付け足します。

後は

docker-compose restart

で反映し、再試行すればいけるはず。

※駄目なら

docker-compose down
docker-compose build --no-cache
docker-compose up -d

の三コンボで何とかなるはず。

最後に(読まなくて良いやつ)

と、いうことで環境は綺麗なまま、ポートも空けずに脱GoogleDriveを達成しました。後は皆さんが自由に遊んじゃってください。

なお、セキュリティとか酷い部分もあるので、そこら辺はよろしくお願いします、です。

タイトルとURLをコピーしました