NextCloudで自分用のクラウドストレージを立てた

DropboxとかBoxとか、特に理由もなくあれこれとクラウドストレージを併用してるけど、アップロードした情報の取り扱いとかを気にするのがめんどくさくなってきた。あと、無料では容量がちょっと物足りないけど、そのサービスに月額課金するほどの 信用 思い入れもない。そんなわけで、おもしろそうだったから自前のストレージサーバを立ててみた。
実際に環境を整えたのは半年くらい前で、その詳細が知りたいという話を人から受けたのが1ヶ月以上前 。今まで放置してて申しわけない。

ごちゃごちゃ言ってるけど、NextCloudに関してはDockerで動かしてるだけなので、そのへんに関しては特におもしろい情報はないと思います。

https://imgs.xkcd.com/comics/standards.png
つまりこーいう話

構成とか条件

個人的な用途、あるいは突然動かなくなってもメンテナンスを楽しむような運用なので、今回は一般にNASに求められるような冗長性は考慮しておらず、データは1台のHDDに置いている。ただし、あからさまに危なっかしい運用は避けたいし、できることなら新しそうな技術を使ってみたい、というモチベーション。

Intel NUC8i5BEH

性能だけを見ればRaspberry Pi 4くらいがちょうどいいんじゃないかと思うけど、物理的な可搬性を考えるとデータ用に2.5インチのHDDが収まってくれると都合がいい。そんなわがままな条件を満たしてくれたので、すでに自宅で使っていたNUCを採用。ただし、ファイルサーバだけのためにこのスペックは明らかに過剰なので、もしこの用途で新しく買い揃えるならもっと安いモデルでいいと思います。

OS

サーバ用途を前提に考えるならLinuxがいいと思う。今回は常用マシンの余剰スペックで動かす程度なので、Windows 10に乗った仮想マシンのUbuntu 20.04 Serverを使った。最近のバージョンであれば、WSL 2のおかげでWindows 10 Homeでも何も考えずにDocker for Windowsが動かせて楽そう。

二重NAT問題

うちのネット環境は賃貸で提供されているので、グローバルIPが与えられていない。どうしようかなあと思ったけど、別途VPSで立てたVPNサーバを経由することにした。VPSはどこで立ててもいい(が、データセンターが海外だとレスポンスが悪かったのでおすすめしない)けど、今回は学生特典が利用できて安く済みそうだったAzureで立てた。

ついでにWindowsのライセンスなんかも貰えるので、対象になる人はとりあえずもらっておくといいと思います。

/images/2020-09/2020-09-22-system-overview.jpeg
こんな環境。

できるだけDockerに任せる

特にVPSはコストを抑えて環境を渡り歩く可能性が高いので、Dockerで雑に展開できる環境づくりを心がけた。

やったこと

NextCloudを立てる

ローカルのNUCにDockerで立てた。Dockerの導入の手間は環境によるけど、少なくともx64なUbuntuであれば、apt install docker.ioからpip3 install docker-composeとかで済んだような気がする。もし外部接続が必要なくて、ローカル環境で動かすだけなら、これで完結する。 SMBでネットワーク共有されたストレージなんかもNextCloudのストレージとしてマウントできる。いろいろと楽だし、場合によってはハマるポイントにもなる。

ドメインの取得

形から入るタイプ おもしろそうだったので、取得した独自ドメインのサブドメインで運用することにした。ドメインは別にどこで取得してもよかったけど、なんとなく洗練されていて管理が楽そうなイメージがあったので、Google Domains で取得した。domains.googleというドメインがまたよいですね。
ドメインの取得が済んだら、DNSの設定から使いたいサブドメインに対してVPSのグローバルIPを割り当ててやればうまくはず。

リバースプロキシ

これはVPS側の話。リバースプロキシというのは、ひとつのIPアドレスで受け止めたリクエストに対して、ドメインなどの条件に応じて異なる処理をするものだと解釈している。
なんとなく眺めていたらnginxがよく使われているように見えたけど、Caddyというのが手軽でおもしろそうだったから今回はこちらを採用した。Caddyの大きな特長のひとつに、Let’s Encryptの証明書を自動で取得してくれることがある。これもDockerで動く。

VPNサーバ

これもVPS側の話。外部アクセスを受け止めるVPSとNextCloudが動いているマシンを同じネットワークに置くためのVPNサーバ。VPNとVPSを同じ文章に登場させると脳が混乱して良くない。これもDockerで動く。
Dockerで動かしたらWireGuardの利点を潰すことになるんじゃないかとも思ったけど、そもそもVPSも安いプランだし、多少の損失は気にならないだろういうことにした。少なくとも自分の用途では、ボトルネックになっているようには見えない。

あんまりアテにならない気がするけど、今回の構成で登場したファイルをなんとなく束ねたものを置いておく。

困ったこと

今回の遊びでハマったことの大半はめんどくさがってWindowsをそのまま使おうとしたことが原因なので、サーバ用にハードウェアを用意すれば大きく困ることはなさそう。

仮想マシンの自動起動

DockerにSMBを認識させる

ログイン後の挙動

その他

見出しの粒度が合ってないなあと思いながら書いていた。
iPad Proで使っているPaperShipというアプリで文献を管理するのにZoteroを使っていて、そのストレージとしてNextCloudのWebDAV機能が使えて重宝している。