自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する
はじめに
撮った写真を管理するために、CHUWI HeroboxというミニPCを先日購入し、Ubuntu 22.04 LTSをインストールしました。
今回は、そのミニPCをNextcloudを使ってファイルサーバ兼Webサーバ化し、Tailscaleというサービスで自宅からでも自宅外からでも同じドメインでアクセスできるようにしました。
通常、自宅にあるWebサーバに外部からアクセスしたい場合は、グローバルIPにドメインを割り当てて、ルータの設定としてhttp / httpsのポートで受けた時に流す設定が必要ですが、これだとグローバルIPの変更に追従できません。
もう一度言いますが今回は、ルータの設定は触ることなく、自宅のWebサーバに任意のドメインで自宅内外問わずアクセスできるようにします。
意外と簡単にできたのでその内容を紹介します。
NextcloudとTailscale
NextcloudとTailscaleについての詳細な説明はしませんがざっくり以下のようなイメージです。
Nextcloud
オンラインストレージの作成と使用のためのクライアント・サーバ型のソフトウェア。機能的にはDropboxに似ているが、オフプレミスのオンラインストレージサービスは提供しない。Nextcloudはフリーかつオープンソースなので、誰でも自分のプライベートサーバにインストールして利用することができる。(Wikipedia 引用)
Tailscale
管理サービスと組み合わせて機能し、WireGuard プロトコルを使用して、他のクライアントとのPeer-to-Peer (P2P) または中継 VPN 通信を確立するためのソフトウェア。(Wikipedia 引用)
最終イメージ
完成図は下記の通りです。
cloud.example.com を叩けば、自宅でホスティングしているNextcloudに繋がることがゴールです。
必要な環境
最低限必要なのは下記です。
- サーバとなるPC
… Nextcloudをホスティングするために必要。今回はUbuntuが入ったCHUWI Heroboxを利用。 - VPS
… TailscaleのExit Nodeとして必要。今回は個人契約しているConoHa VPSを利用。 - 独自ドメイン
… TailscaleのIPアドレスに割り当てるドメインとして必要。今回はConoHaで個人管理しているドメインがあるのでそれを利用。(ここではexample.comとします)
自宅内だけの利用 (Tailscaleを利用しない場合) であればVPSおよび独自は不要です。
余談ですが、このブログはConoHa WINGを使っていて、個人的な自由に使える個人サーバとして、ConoHa VPSをそれぞれ契約しています。
なかなか高速で使い勝手が良いのでおすすめです。
ConoHa WINGは独自ドメインを永年無料でもらえるのでそれも魅力的です。
手順
これ以降は、Ubuntu PCのIPアドレスを 192.168.10.123、最終的に利用するNextcloudドメインを cloud.example.com と仮定して進めます。
Nextcloudを立ち上げる
docker composeで立ち上げます。
Ubuntuでのdocker compose環境の整備はたくさん記事がありますのでここでは割愛します。
立ち上げるだけであれば簡単で、docker-compose.ymlファイル作成しましょう。
version: '2'
volumes:
nextcloud:
db:
services:
db:
image: mariadb
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=admin
- MYSQL_PASSWORD=admin
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
image: nextcloud
ports:
- "8080:80"
environment:
- NEXTCLOUD_TRUSTED_DOMAINS=192.168.10.123:8080
links:
- db
volumes:
- nextcloud:/var/www/html
restart: always
その他MySQLのパスワードなどは適宜変更してください。
そうしたら立ち上げましょう。
$ docker compose run -d
すると、Ubuntuのローカルホストでnextcloudが立ち上がるはずです。
Ubuntu PCでは http://localhost:8080、または http://192.168.10.123:8080 にアクセスしてみましょう。
こんな感じの初期セットアップ画面が表示されていたらOKです。
管理者ユーザ名とそのパスワードは適当に好きなもので良いです。
ストレージとデータベースについては、MySQL/MariaDBを選択します。
あとは下記のように入力しインストールを行います。
ひとまずNextcloudの設定はこれでOKです。
自宅内部で扱うのであればIPアドレスを叩けば良いので、ここまででOKです。
ここからは、自宅内外どちらからでもドメインでアクセスできるようにしていきます。
まずは先回りしてNextcloud側の設定を変えます。
$ docker compose down
TRUSTED_DOMAINSを最終的に利用するドメインに変えて再起動しておきます。
# - NEXTCLOUD_TRUSTED_DOMAINS=192.168.10.123:8080
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com
$ docker compose up -d
Tailscale設定
続いてTailscaleの設定です。
https://tailscale.com/からまずはアカウントを作成しましょう。
あとは基本的に、案内にあるコマンドを実行するだけです。
1台目は自宅ミニPCのUbuntuサーバで、実行してください。
VPS側設定
VPS側では引き続きTailscaleの案内にしたがって設定を行うのに加えて、VPS管理ページでホスティングしたいドメインの設定を行います。
ConoHaであれば、VPS管理画面の「DNS」からドメインリスト example.com を選択し、新たに下記のレコードを追加します (ドメイン名やIPアドレスは適宜変更してください)。
タイプ | 名称 | TTL | 値 |
A(通常) | cloud | 3600 | 【VPSのIPアドレス】 |
そうしたら、VPSサーバで cloud.example.com というドメインでアクセスを受けた時にTailscaleのIPアドレスを割り当てます。
私の場合はすでに、VPSサーバで別のサービスをホスティングしており、そこで dockerイメージの https-portalを使っていたので、そこに設定を付け加えることにしました。
重要部分だけ抜き出すと下記です。
version: "3"
services:
https-portal:
image: steveltn/https-portal
ports:
- '80:80'
- '443:443'
restart: always
volumes:
- https-portal-data:/var/lib/https-portal
healthcheck:
test: ["CMD", "service", "nginx", "status"]
interval: 30s
timeout: 20s
retries: 3
environment:
DOMAINS: 'cloud.example.com -> http://100.88.XXX.XXX:8080'
STAGE: 'production'
WEBSOCKET: 'true'
CLIENT_MAX_BODY_SIZE: '0'
volumes:
https-portal-data:
ちなみに、 100.88.XXX.XXX はTailscaleのIPアドレスで、TailscaleのVPS側設定で得られたIPアドレスになります。
これで、https://cloud.example.com で自宅にあるUbuntu PCにアクセスできるようになりました!
終わりに
結構大雑把な記事になってはしまいましたが、これほど簡単に実現できるとは思っていませんでした。
Tailscaleというサービスも最近知ったのですが、他にも色々な使い道がありそうです。
P2P含め、これからネットワークの勉強をしっかりしようかな…。