araki tech

for developers including me

自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する

自宅 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 引用)

自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する
https://nextcloud.com/

 

Tailscale

管理サービスと組み合わせて機能し、WireGuard プロトコルを使用して、他のクライアントとのPeer-to-Peer (P2P) または中継 VPN 通信を確立するためのソフトウェア。(Wikipedia 引用)

自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する
Subnet routers and traffic relay nodes

最終イメージ

完成図は下記の通りです。

cloud.example.com を叩けば、自宅でホスティングしているNextcloudに繋がることがゴールです。

自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する



必要な環境

最低限必要なのは下記です。

  1. サーバとなるPC
    … Nextcloudをホスティングするために必要。今回はUbuntuが入ったCHUWI Heroboxを利用。
  2. VPS
    … TailscaleのExit Nodeとして必要。今回は個人契約しているConoHa VPSを利用。
  3. 独自ドメイン
    … TailscaleのIPアドレスに割り当てるドメインとして必要。今回はConoHaで個人管理しているドメインがあるのでそれを利用。(ここではexample.comとします)

自宅内だけの利用 (Tailscaleを利用しない場合) であればVPSおよび独自は不要です。

余談ですが、このブログはConoHa WINGを使っていて、個人的な自由に使える個人サーバとして、ConoHa VPSをそれぞれ契約しています。

なかなか高速で使い勝手が良いのでおすすめです。

ConoHa WINGは独自ドメインを永年無料でもらえるのでそれも魅力的です。

ConoHa WING 👇

ConoHa VPS 👇

手順

これ以降は、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 にアクセスしてみましょう。

自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する

こんな感じの初期セットアップ画面が表示されていたらOKです。

管理者ユーザ名とそのパスワードは適当に好きなもので良いです。

ストレージとデータベースについては、MySQL/MariaDBを選択します。

あとは下記のように入力しインストールを行います。

自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する

ひとまず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/からまずはアカウントを作成しましょう。

あとは基本的に、案内にあるコマンドを実行するだけです。 自宅 Ubuntuサーバー × Tailscale × Nextcloudで内部・外部アクセス可能なファイルサーバを構築する

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含め、これからネットワークの勉強をしっかりしようかな…。