☁️

NextCloud+Tailscaleで自宅オンラインストレージを手軽に運用する

に公開

はじめに

初投稿です。
しがない情報系学生の私ですが、この度ミニPCを購入して自宅サーバ生活をスタートしました。まずはオンラインストレージのNextCloudの運用から始めようと思い試してみたのですが、思いの外簡単だったので記録しておこうと思います。Tailscaleを使えばグローバルIPの固定もドメインの取得も必要ありません

使用するPC

今回購入したのは、こちらのMinisForum UM680 Slimです。
https://www.minisforum.jp/products/minisforum-um760-slim
自宅サーバとして運用するにしてはかなりオーバースペックな気もしますが、M.2対応のSSD2枚挿しが可能な点が決め手でした。NextCloudを運用するにあたってRAID 1で運用したかったためです。

セットアップ

購入したミニPCにはWindows 11 Proがプレインストールされていました。
セットアップの際には、ネットワークに接続しない(=ローカルアカウントを作成する)ことをお勧めします。Microsoftアカウントと連携すると専用のアプリケーションやクラウド機能が追加されますが、今回はサーバ運用が目的なのでパフォーマンス的にも余計なお世話だからです。

Linuxのインストール

自宅サーバを運用するにあたって、WSL2上で動かすか、Linux上で動かすかという選択肢があると思いますが、今回はWSL2上で動かすことにしました。プリインストールされているWindowsを削除するのは何だか勿体無いですし、かといって同一SSD上でデュアルブートするのはリスキーだと思ったためです。

ディストリビューションはDebianを使用しました。PowerShell等で以下のコマンドを実行。

wsl --install -d Debian

インストールが完了するとUNIXユーザの作成が求められるので適宜設定します。
これだけで完了です。以降はDebian上で操作します。

NextCloudの導入

NextCloudとは、オープンソースで公開されているオンラインストレージサービスです。各自のサーバでself-hostすることで、容量無制限かつ安全にオンラインストレージを構築できます。

今回はdocker-composeを使ってコンテナ上でNextCloudを動かします。
まずはdockerのインストールから。公式ドキュメントの通りにコマンドを実行します。

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

続いて、適当なディレクトリ内でdocker-compose.ymlを作成します。

docker-compose.yml
services:
  db:
    image: postgres
    volumes:
      - ./db_data:/var/lib/postgressql/data
    environment:
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_PASSWORD: root
  app:
    image: nextcloud
    environment:
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=root
      - POSTGRES_HOST=db
    ports:
      - 8080:80
    volumes:
      - ./nextcloud_data:/var/www/html
    depends_on:
      - db

ここでいうdbにはファイルが保存されるのではなく、ユーザ情報などのメタデータが保存されます。ある程度好みで選んで問題ないと思います。今回はPostgreSQLを使います。

docker compose up

でコンテナを起動します。http://localhost:8080 にアクセスすると、管理ユーザの作成画面が表示されるので、適宜作成します。その後も指示通りにセットアップを行います。これで完了です。

Tailscaleの導入

Tailscaleとは、Tailscale社が提供するVPNサービスです。各自が持っている端末をネットワーク上に登録していくことで、メッシュ状のVPNを構築できる点が特徴です。

まずはTailscaleをインストールします。curlで一発でインストールできるようです。

curl -fsSL https://tailscale.com/install.sh | sh

続いて、Tailscaleを起動します。

sudo tailscale up

認証のためのURLが表示されると思うので、そちらにアクセスしてアカウントを登録してください。登録が完了すると、以下のような管理画面が表示されると思います。

"Machines"タブには登録した機器の一覧が表示されます。私は自宅サーバ(almond)、Mac、iPhoneを登録しているのでこのように表示されています。NextCloudでアクセスしたい機器全てにTailscaleをインストールします。詳しい方法については公式ドキュメントから確認できます。

これで登録した端末間でのVPNが構築されました。管理画面に表示されているIPアドレスを使って各端末にアクセスすることができます。また、"DNS"タブからTailnet Nameなるものを確認できます。

これは各VPNに割り当てられたドメインのようなものです。これと端末名を組み合わせて、(端末名).tailXXXXXX.ts.netが各端末のアドレスになります。端末名とは、先ほどの"machines"タブで表示されていた名前のことです。
例えばhttp://(自宅サーバの端末名).tailXXXXXX.ts.net:8080にアクセスすれば先ほど立ち上げたNextCloudに繋がります。

NextCloudのアクセス設定

しかし、このままNextCloudにアクセスすると「信頼できないドメインを介したアクセス」と表示され弾かれてしまいます。NextCloudはセキュリティの都合上、アクセスを受け付けるドメインをconfigで指定する必要があります。nextcloud_data/config/config.phpを編集します。

$CONFIG = array (
  ...
  'trusted_domains' =>
  array (
    0 => 'localhost:8080',
  ),
  ...
)

となっているので、1 => '(サーバ名).tailXXXXXX.ts.net:8080'を追加してあげます。

アクセスできるようになれば以上で構築完了です!

RAID設定

追加のSSDが届いたら追記しようと思います。

終わりに

以上になります。よく自宅サーバ民は逸般の誤家庭などと言われがちですが、昔と比べて今は格段に運用が楽になっているのではないかと思います。特に金銭面・セキュリティ面のハードルをTailscaleが解決してくれるのが非常に大きいです。本当に思ったより楽だったので、興味を持った方は是非とも自宅サーバを始めてみてはいかがでしょうか。

Discussion