Truenas Core+Nextcloud環境構築

# はじめに
従来は膨大なドキュメントのデータを6TBのHDD上に、研究用のデータをオンラインストレージのSeafileで200GBのSSD上に保存していたが、容量が圧迫されていたため、保存環境の見直しを行った。
## 従来環境
- OS
    - Ubuntu Mate 18.04 LTS Desktop
- ストレージ
    - 100GB SATA SSD
        - OS用
    - 6TB HDD
        - ドキュメント保存用
    - 200GB SATA SSD
        - オンラインストレージ用
- サービス
    - ドキュメント保存用
        - SFTP
    - オンラインストレージ
        - Seafile
            - 高速な同期が可能だが、著名度に難あり。Joplinとの直接の提携ができない。
    - 研究ノート(Markdown)
        - Joplin
            - 内部リンク、Mermaidなども使えて、重宝している。
          
## 必要なこと
今回の環境構築にあたって、保存環境に必要なことを記述する。

- NASに求める条件
    - データの冗長性の確保
        - 今まではHDD一個に保存していたため、データが消える可能性が大いにあった。
    - 容量の拡大
        - 6TBの容量に達したため、より大きな容量が必要であった。
    - 管理の簡単さ
        - GUIで状態の管理、機能の設定をできることを求める。
- オンラインストレージに求める条件
    - NAS上での簡単な環境構築
    - 高速な同期
    - ファイルの編集履歴の保存
    - 削除したファイルの保存（ゴミ箱）
    - Joplinとの提携の容易さ
    - 知識のない家族でも簡単にインストール、利用ができること
- ドキュメント保存
    - 高速な転送
- 研究ノート
    - Joplinを用いる
    
## 新環境
必要な条件から新環境を決定した。

### ソフトウェア構成
- NAS OS
    - Truenas Core
- オンラインストレージ
    - Nextcloud
        - プラグインから簡単にインストール可能
        - 同期は遅いがMemcache（データをメモリ上にキャッシュ）を設定すればある程度の高速化は可能
        - SeafileはTruenasのプラグインにはなかった。
- ドキュメント保存
    - Webdav
        - 保存にはSFTPでアクセスする
        - SFTPの設定が面倒な端末では閲覧はWebdavで行う
- 研究ノート
    - Joplin
        - Nextcloudとの直接提携可能

### ハードウェア構成
- 5.25インチベイ 3個
    - 5.25インチベイ3個を3.5インチベイ5個に変換が可能な[部品](https://www.aliexpress.com/item/1005002794544409.html?spm=a2g0o.productlist.0.0.58223e2ahfSVxI&algo_pvid=15cccfe7-e793-4455-8ecb-099fca977be4&algo_exp_id=15cccfe7-e793-4455-8ecb-099fca977be4-15)を購入。
    - 冷却が必須なため、ファンがついているものを選んだ
    - レールがついているため、簡単にHDDの抜き差しが可能
- 3.5インチベイ 8個
    - ファンがついているため、冷却が可能
    - レールがついているため、簡単にHDDの抜き差しが可能
- ZFS VDEV
    - RAIDZ2
        - 2個のHDDまで壊れても元のデータが復元可能
        - 1個のHDDが壊れた後のResilveringでもう一個が壊れる可能性が十分にあるためRAIDZ1にはしなかった。
    - 6 x 3TB SATA HDD (12TB利用可能)
    - RAIDZには書き込み方式の一つであるCMRが必須
- メモリ
    - 24GB
        - OS用
            - 2GB
        - ARC(ZFSキャッシュ)用
            - 12GB以上（自動割り当て）
            - [VDEV 1TB当たり1~5GBが必要であるという記述](https://en.wikipedia.org/wiki/ZFS#Deduplication)があったため、したがった
        - memcache(Nextcloudキャッシュ)用
            - 10GB以上（自動割り当て）
- SATA端子
    - 端子が足りなかったため、追加
        - (JMB585) 2 x PCIe3.0 -> 5 x sata3.0アダプタ
- SATA15pin電源端子
    - 端子が足りなかったため、追加
        - IDE4pin -> 5 x SATA15pin

# 環境構築
## Truenas CORE
インストール手段は省略する。設定内容について述べる。

- snapshot
    - 毎日深夜に一回、二週間保存
- SMARTテスト
    - 毎日深夜に一回
- スクラブ
    - 毎日深夜に一回
- UPS
    - 20分間電源が再生しない場合はシャットダウン
- 管理画面へのアクセス
    - ルーター上でポートフォワーディングを行う。9022 -> 22
    - パスワード認証を無効化。公開鍵認証を利用
    - SSHトンネルでlocalhost:1443からアクセスできるようにする
    - SSH config設定内容

```bash
Host truenas_gui
User (ユーザー名)
HostName (グローバルIP)
IdentityFile ~/.ssh/truenas
ForwardX11 yes
Compression yes
Port 9022
LocalForward 1443 localhost:443   
```

## Nextcloud
- TruenasのプラグインからNextcloudをインストール
- グローバルIPからアクセスできるように`/usr/local/www/nextcloud/config/config.php`の以下の行を編集

```bash
'trusted_domains' =>
array (
  0 => 'localhost',
  1 => '(ローカルIP)',
  2 => '(グローバルIP)',
),
```
 
### Memcacheがないため、Shellから設定
- Shell上で以下のコマンドを実行

```bash
pkg install p5-Locale-gettext help2man texinfo m4 autoconf
portsnap fetch extract
make config-recursive install -C /usr/ports/database/pecl-redis
```

- `/usr/local/etc/redis.conf`の以下の行を編集
    - portの行を`port 0`に変更
    - unixsocketの行を以下に変更
    
```bash
unixsocket /tmp/redis.sock
unixsocketperm 777
```

- Shell上で以下のコマンドを実行

```bash
sysrc redis_enable=YES
service redis start
```

- `/usr/local/www/nextcloud/config/config.php`に以下の行を追加

```bash
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => 
array (
  'host' => '/tmp/redis.sock',
  'port' => 0,
),
```

## Joplin
- Joplinの設定から同期先としてNextcloudを設定
    - リンク：`https://[グローバルIP]/remote.php/dav/files/[ユーザー名]/[joplinのディレクトリ]`

## ファイルの移行（ext4->zfs）
Shellで以下のコードを実行する。

```bash
fsck_ext2fs /dev/adXXpX
mount -t ext2ds /dev/adXXpX /mnt/(mount先)
```

rsyncを用いて内容を移行する

```bash
rsync -avh --info=progress2 (コピー元) (コピー先)
```