OneDriveがいっぱいになったので自作クラウドをつくってみた

メインで使っているクラウドストレージ（OneDrive 5GB）がいっぱいになってしまったので、外からでもアクセスできるNASを作ろうと試行錯誤した話です。

![こういうことってありますよね](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349830/70d1bc49-382c-53b5-0434-d881aa2dcc05.png)

ちなみに、SambaとDockerは使い方が分からなかったので、諦めました。また、ファイル共有元にするサブPCのOSはWindowsなので、Linuxを使うものも条件から外しました。ここらへんの内容を求めてた方にはすみません。。。

# 自作クラウドストレージに求める条件
・物理ストレージを用意すればあとは電気代だけで運用できる
・家からでも外からでもアクセスできる（LANでもそうでなくてもアクセスできる）
・主にPDF、画像類をupするつもりなので、それらが閲覧できる
・WindowsのエクスプローラーでNASのようにアクセスできる
・クラウドストレージで言うところのファイル共有機能のような、誰でも見れたり、一部の人しか見れなかったり、公開範囲を設定できる

ここら辺に注目しながら考えてみよう。

# 案1：FTP接続を使う
FTP接続とは、昔Web上のファイル保持に使われていたらしいファイル公開方法です。

### 構築
WindowsでFTPサーバーを建てるにはIISを使います。詳しい構築方法は、[WindowsでFTPサーバー構築 - Qiita](https://qiita.com/A-Kira/items/b9a629647ab0bdf9e4b1)を参考にしました。
この方法では閲覧に、サーバーIP（`ftp://`から始まるドメイン）、ユーザー名、パスワードが必要です。一応公開範囲はこのユーザーを活用することで設定できそうです。

### 公開
FTPサーバーの公開には20,21番ポートを開ける必要があります（参考：[【FTPの仕組み】「 21番ポート」と「20番ポート」 ・「アクティブモード」と「パッシブモード」について](https://mechalog.com/ftp-shikumi)）。

### 接続
本来webブラウザからアクセスするものですが、古すぎるのかInternetExplorerからしかアクセスできないっぽい。肝心のIEもサポート終了でうまく動かず（EdgeはFTP非対応）。
詰みかと思いきや、Windows標準のファイルエクスプローラーでアクセスできるらしい。詳しい接続方法は[WindowsでFTPクライアントソフトを使用しないFTP接続方法](https://amksystem.com/tech/ftp-connect/)を参考にしました。

これでクラウドとして使える！と思いきや、使い勝手がかなり悪かったです。例えば、右クリックで出てくるメニューがこれしかありません。

（画像を挿入しようと思ったのですが、他の接続方式を構築してしまったせいかアクセスできなくなってしまったため、画像無しです。。。）
新規作成からはフォルダしか作れません。

さらに、まさかのPDFがダウンロードしないと開けません！
さすがにこれは使えないので、別の案を探します。

# 案2：SMB接続を使う
SMB接続とは、Windowsの通常のファイル共有で使う接続方法です。NASと同じじゃん！と思った方、NASと同じです。LAN内でNASに接続するときに使うポートを解放して、外からでもNASにアクセスしようという作戦です。

### 構築
FTPサーバーと違って構築は簡単です。共有したいフォルダを右クリックして「プロパティ」→「共有」タブ→「共有」ボタンを押し、共有するユーザーを選択するだけです。

### 公開
次に公開方法ですが、まずはファイアウォールをいじる必要があります。具体的な方法は[外部ネットワークからWindowsファイル共有にアクセスするには？](https://takabus.com/tips/1967/)を参考にしました。途中の手順でスコープ（接続可能なIP）を設定するところがあるのですが、そこで「任意のIPアドレス」を選択します。
さらにポート開放が必要です。[SMBとは - IT用語辞典 e-Words](https://e-words.jp/w/SMB.html)によると、NetBTを使う場合はTCP/UDPの137-139番ポートを、NetBTを使用しないダイレクトホスト方式ならTCPの445番ポートを使うらしい。方式がどちらなのか区別がつかなかったので、両方ポート開放しました。

### 接続
接続はエクスプローラーのアドレスバーに`\\(ドメイン、WANIP)\(共有名)`を入力するだけです。「ネットワークドライブの割り当て」や「ネットワークの場所の追加」から追加することで毎回入力せずにアクセスすることも可能です。

使い勝手はネットワークドライブにしたNASと全く同じなので、ローカルのファイルと操作性は全く変わらず、かなり良好です。FTPのときのように右クリックのメニューが貧弱だったりしません。

しかし残念ながら接続できるかどうかが非常に不安定でした。大学の学内WiFiと携帯回線のテザリングでしか接続できず、接続テストを頼んだ友人は一人も接続できませんでした。たまにそれ以外の回線でも接続できたりできなかったりとそこらへんも不安定です。接続できる規則性を探そうと模索したのですが、外から見た時にipv4だと接続できてipv6だと接続できない？（LAN内で接続するときはLANIPで接続するからipv4だよなあという理由から）くらいの仮説しか立てられず、じゃあ接続できたりできなくなったりする回線はどうなんだというと説明がつかなかったり。。。
ちなみに、そもそもSMB接続に使うポートを開放するのは（セキュリティ面だったかの理由で）推奨されないらしいです。
ということでなんだかんだこの案も没です。

# 案3：WebDAVを使う
FTPサーバーに接続するとき、こんな注意書きが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349830/2f77cc57-6318-370f-e0cf-edc95ff269ca.png)
ん？WebDAVってなんだ？FTPと同じような何か接続方式なのか？というのがWebDAVを調べ始めたきっかけです。

WebDAVはWebサーバー上のファイルを共有できるようにする技術のことです。FTPサイトを作るときに使ったIISを使って構築します。

### 構築
構築方法はこのサイトを参考にしました（途中まで）。
参考：[Windows 10 IIS WebDAV 設定](https://appletllc.wordpress.com/windows-10-iis-webdav-%E8%A8%AD%E5%AE%9A/)

Windows Serverで構築する場合はこちら。
参考：[【完全版ガイド】IISでWebDAV を設定する Windows Server（標準版）](https://rin-ka.net/windows-server-iis-webdav/)

### 公開
WebDAVはwebサイトと同じく、HTTPなら80番、HTTPSなら443番ポートを開放する必要があります。

### 接続
FTPと同じく通常はブラウザでアクセスします。アドレスは`http://(ドメイン or WAN IP)/(IISで設定した仮想ディレクトリ名)`です。アクセスするとこんな感じの簡素なUIでファイル一覧を表示してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349830/d4b7058c-517d-46bc-734c-57982c031221.png)

これでとりあえずpdfも画像もweb上で閲覧できるし、必要ならダウンロードすることもできます。接続もかなり安定しています。

見た目が気になる場合は「h5ai」というPHPプログラムを使うといい感じのクラウドストレージっぽくなります。
参考：[【webdavにおすすめ】ブラウザでディレクトリへアクセスしたときのインデックス表示をかっこよくする](https://qiita.com/laineus/items/de905a0a5c57b20598ac)

ただこれを導入するのはあんまりおすすめしません。
というのもこれを導入してしまうと、Windows標準のエクスプローラーでアクセスできなくなります。
え！？エクスプローラーでアクセスできるなら最初からそうすればよかったじゃんと思うかもしれませんが、若干面倒でHTTPS化が必要になります（参考：[Windows 10 からの WebDAV 接続](https://support.kagoya.jp/kir/manual/webdav/win10/index.html)）。

### HTTPS化
ということでWebDAVのサイトをhttps化していきます。
参考：[IISのHTTPS設定手順：Let’s Encryptを利用したSSL化（win-acme）](https://rin-ka.net/iis-lets-encrypt-win-acme/)

https化できたら、エクスプローラーのアドレスバーに`https://(ドメイン or WAN IP)/(IISで設定した仮想ディレクトリ名)`を入力（もしくはドライブの追加やネットワークの場所の追加でもok、おすすめはネットワークの場所の追加。理由はドライブの追加だと空き容量が自身のCドライブになってしまい正しく表示されないから）します。

この接続では右クリックのメニューも減っていないし、PDFや画像の閲覧も可能なので、ローカルのファイルと同じように扱えそうです。

## さらに
### 基本認証（ユーザー・パスワード設定）
IISでは匿名認証を基本認証に変更することで、アクセスできる権限を設定することができます。WebDAVでは、ディレクトリの共有設定で共有しているユーザー（権限が付与されたもの）にのみ閲覧が許されます。書き込みも同様にその権限が共有設定で割り当てられていれば書き込みが可能になります。
これを利用すれば、限定公開設定が可能です。一方で基本認証を有効にすると必ずユーザー名・パスワードが求められるため、一般公開はできなくなります。とはいえ公開したいならゲスト用のユーザーを用意しておけばいいだけなので、柔軟性があります。

#### ※書き置き
認証が設定されている状態でエクスプローラーからアクセスしようとすると、ユーザー名とパスワードが求められますが、正しく入力してもなぜか接続できません。
自分の場合は
①正しいユーザー名パスワードを入力してokを押す
②もう一度同じダイアログが出てくるがこれをキャンセルする
③再度接続する
④なぜかつながる
で解決しました。

### ログ削除
IISは使ってるとログがたまっていき将来的にストレージを圧迫するらしいので定期的に削除するルールを追加しておくといいらしいです。
参考：[IISログを自動的に削除する Windows](https://rin-ka.net/auto-delete-iis-logs/)

### WebDAVのデメリット
デメリットもあります。
エクスプローラーから接続し、書き込み権限があれば、アップロードも可能なのですが、その速度がものすごく遅いです。ちなみにダウンロード速度は普通の速度です。
また、使っている人のCドライブの空き容量より大きなファイルは送ることができません。

# まとめ
いろいろなファイル共有方法を試した結果、WebDAVに落ち着き、現在運用しています。専用ソフトウェアやLinuxによるサーバーを使わずとも、Windowsでここまでできました。