[ドケチ話] 無料で200GBのNASをクラウドで手に入れた

# NASがほしい

今までSynologyのNASを使っていたが、
- 機器のお守りをしたくない(ズボラなので)
  - HDDの稼働音がうるさい
  - 掃除を定期的にしないといけないのがめんどい
- 保存しておきたいデータが録画鯖のテレビ番組程度しかない
  - ファイルをそのまま吐き出すため、CIFS/NFSマウントしてNASに逃がしていた

という状況のため、今まで使っていたNASを友人にすべて明け渡した。
録画鯖のデータくらいなら100GB〜200GBもあれば十分。

# OCIの無料枠

OCIは
- armインスタンスが4core/24GB
- armインスタンスは1coreあたり1Gbpsの帯域が付帯
- 10TB/月までのアウトバンドトラフィック
- 200GBまでブロックストレージ

が無料枠で提供されるため、NASの用途にしてくださいと言わんばかりである。

# つまりOMVを利用したらタダでNASが用意できるのでは？

OSSのNAS OSとしてはいろいろあるが、OMVはDebian上にインストールしてセットアップすることも可能。

https://github.com/OpenMediaVault-Plugin-Developers/installScript

比較的導入が楽そうだったのでOMVを採用することにした。

# つまづきどころ

いくらかつまづきポイントがあった。

## OCIはDebianイメージが存在しない。

そりゃOMVのイメージがないのは当然だけど、何故かDebianだけイメージを選択できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/fb1de446-70ee-4a3a-b6af-c999a37f3a04.png)

そのため、
- OCIにカスタムイメージを上げる
    - Debianイメージをカスタムイメージとして上げる
    - OMVを設定済みにしてカスタムイメージとして上げる
- なんかしらの工夫でDebian環境を生成する

など工夫が必要だった。
そこで、↓を見つけた。こいつを使うとDebianの用意が一番楽そうだったのでこいつでやることにした。


https://gist.github.com/ishad0w/10a536f82c79d3b890d04243634df806


手元のマシンとか、任意のマシンで、一時的に立ち上げといたUbuntuインスタンスに対しスクリプトを以下のように実行する。
```:shell
wget https://gist.githubusercontent.com/ishad0w/10a536f82c79d3b890d04243634df806/raw/oci_ubuntu_to_debian.multiarch.sh

chmod +x oci_ubuntu_to_debian.multiarch.sh
./oci_ubuntu_to_debian.multiarch.sh <your_ubuntu_server_extIP>
```

ただし、こいつの最後のDebian initialisationでコケがちなので、多分SSHの接続周り？かわからんけど、スクリプトの以下の部分の直後に`sleep 10`くらいいれてやったことでとりあえず解決した。重要なことでもないので一旦これでいいやという感じ。
```
echo -e "\nAdding temporary SSH-key for Debian root user..."
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -p 22 debian@$1 \
    'sudo cat /home/debian/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys'
```

あとはDebianになった状態なので、

https://github.com/OpenMediaVault-Plugin-Developers/installScript

でインストールして設定を進めるだけ。

## OMVはブートディスクを共有できない

OMVは概念として、システムディスクと共有に使うディスクを別にすることを想定している。
そのため、システムディスクの任意のディレクトリを共有するようなことはできない。

それなら普通にシステムディスクを20GBとかで用意したらいいじゃない、と思うかもしれないが、OMVをインストールした直後は3GB未満程度しかないのに、OCIの仕様で、ブートディスクは47GB〜である。(なんで？)
ブートボリュームのサイズ指定をしようとすると50GB〜を選ぶことになる(そこは47GBではないのか…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/41b7543a-f3e8-9d7d-1e6c-eebeb926cca0.png)

このまま、OMVのセオリーどおりにセットアップしようとすると、無料枠では、

- ブートボリューム: 47GB
- データディスク: 153GB

でセットアップすることになる。
ブートボリュームが絶対40GB以上余ってしまうので、ブートボリュームを200GBにしたい。

これはOMVのプラグインとして、`openmediavault-sharerootfs`を入れると解決する。

https://x.com/MiutakuTech/status/1866489755506266394

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/e821f7cb-953b-3b05-1ff6-213bf7037512.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/be7cf8c6-06d5-4de3-82d4-97e0470517ba.png)

## CIFSが文字化けする

docker-composeで、こんな感じでCIFSマウントしているのだが、

```
volumes:
  mysql-db:
    driver: local
  nas_recorded:
    driver_opts:
      type: cifs
      o: 'username=__CIFS_USER__,password=__CIFS_PASSWORD__'
      device: "//__CIFS_HOST__/recorded"
  nas_thumbnail:
    driver_opts:
      type: cifs
      o: 'username=__CIFS_USER__,password=__CIFS_PASSWORD__'
      device: "//__CIFS_HOST__/thumbnail"
```
https://github.com/miutaku/docker-mirakurun-epgstation-softcas/blob/v2/docker-compose-epgstation.yml#L55-L67

おそらく文字エンコードの関係で文字化けする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/18a32fd9-3b5f-ba13-45aa-38e99d635178.png)

そこで、直してあげる。(録画サーバ側、OMV側両方)

```shell
$ sudo apt install linux-modules-extra-$(uname -r)
$ ls /lib/modules/$(uname -r)/kernel/fs/nls/nls_utf8.ko.zst
/lib/modules/6.8.0-1016-oracle/kernel/fs/nls/nls_utf8.ko.zst

$ sudo apt install language-pack-ja
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo dpkg-reconfigure locales
...
[More] 169 # 169. ja_JP.UTF-8 UTF-8を選択


(Enter the items or ranges you want to select, separated by spaces.)

Locales to be generated:

Many packages in Debian use locales to display text in the correct language for the user. You can choose a default locale for the system from the
generated locales.

This will select the default language for the entire system. If this system is a multi-user system where not all users are able to speak the default
language, they will experience difficulties.

  1. None  2. C.UTF-8  3.   4. ja_JP.UTF-8
Default locale for the system environment: 4

Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.
```
直したら録画サーバとOMVを再起動しておく。

## ACL周り

CIFSのパーミッション的なところで、dockerからアクセスできなかった。
### 解決するためには

#### 1. パーミッションを与える
例えばアクセスにdebianユーザを利用する場合こんな感じ。

ストレージ→共有フォルダ→アクセスコントロールリストを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/aaa52fa7-fad2-0440-5484-cf19da36a91f.png)

もう一つ、ストレージ→共有フォルダ→パーミッションを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/ba2bff89-3c05-97a7-93e5-300f6795d285.png)


#### 2. CIFSのACL設定をする
サービス→CIFSで以下を設定してやる。(設定見逃してた…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/42877248-b88c-d069-5cdc-0f723f8c0083.png)

### インストールできた証拠↓

https://x.com/MiutakuTech/status/1866467098127745389

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271301/003ef5c3-f4d6-195a-d2a6-1ff9da41a38c.png)


# 所感

クラウドであれば、物理層はあっちがお守りしているので、RAIDでミラーリングしないといけないとかあまり考えないで良い。
当然`S.M.A.R.T.`とかも見なくていい。最低限Grafanaとかでリソース管理しておくか〜程度でいい。
NASはハードの管理がそれなりにコストがかかるので、これで管理コストが一気に下がる。
だがOMVのデータさえ損失してほしくないものもあるので、バックアップ的なのは一段あってほしいかも。

# やりたいこと

とりあえず動かしはじめた段階なので、やることがそれなりにある。

## バックアップ

先述した通り、OMVのデータが損失するのは嫌だ。
これはいい感じにバッチジョブなりなんなりでcoldとかでオブジェクトストレージに逃がすとかしてあげるつもり。
というか定期的にディスクスナップショット取れば直前のデータ復元ができるわけで、それでいいような気もする。

## 監視

まだこいつ監視せっていしていないので設定したい。
Grafana Cloudが無料枠でよさげに使えるのでこいつに自分のリソースをすべて監視をまとめさせたい。
OCIの監視をデータソースにしてみたことがあるが、取るMetricsがへんてこだったりして、バグがそれなりに多い記憶。
そのため、OMVのdockerコンテナ機能で、node-exporterを動かしてやるとかでいいかもなぁ〜って感じ。

## ファイルシェアリングをしやすく

今のままだとSMBかNFSしか使えないので、不便なので、いい感じにnext cloudとか使ってファイルを拾ってきやすくしたい。
前述した通り、OMVのdockerコンテナ機能を使えばいい感じにできそうだと思っている。

## Cloudflare access化

- OMVのコンソール
- next cloudとか(入れたら)

あたりをCloudFlare access経由でアクセスできるようにしてあげたい。

## CI/CD

とりあえず動かしてみる程度だったので、ぬくもりのあるポチポチで設定しただけ。
ある程度CI/CD化する予定。