RaspberryPi3とNextCloudでメディアサーバを構築する

# はじめに
RaspberryPi3とNextCloudでプライベート用メディアサーバを構築してみました．本記事はその時の手順のメモになります．
また，本記事ではOSはRaspbianを採用し，データの保存場所はRaspberryPi3にUSB接続した外付HDDを使用しています．

ちなみにラズパイ上でNextcloudを使うためのNextCloudPiというOSもリリースされています．気になる方は調べてみてください． -> https://ownyourbits.com/2017/02/13/nextcloud-ready-raspberry-pi-image/

# 用意したもの
* Raspberry Pi 3 Model B
* micro SDカード 16GB
* Raspberry Pi用の電源ケーブル
* TOSHIBA 外付HDD 3TB
* USB接続のキーボードとマウス

# NextCloudについて
NextCloudとはオンラインストレージを構築できるOpen Source Softwareです．
ownCloudというサービスをフォークして開発されています．

NextCloud HP - https://nextcloud.com
 
# 本編 -RaspberryPi3でNextcloudを使う-
## 初期設定
はじめにRaspberryPiにRaspbianをインストールします．
Raspbianのインストールについては過去に別の記事を書いているので省略します．Raspbianのインストール手順が分からない方は是非ご覧ください！ -> [Raspbianのインストールと初期設定](https://qiita.com/pira/items/d2f3d18f98d7bde04a87)

Raspbianをインストールしたらパッケージの更新もしておきます．

```bash
$ sudo apt-get update
$ sudo apt-get upgrade
```

## Apacheのインストール
WebサーバソフトウェアのApacheをインストールします．

```bash
$ sudo apt-get install apache2
```

PHP7.0をインストールします．

```bash
$ sudo apt-get install php7.0
```

インストールが完了したら，とりあえずApacheを再起動しておきます．

```bash
$ sudo service apache2 restart
```

## NextCloudのインストール
ディレクトリを移動します．

```bash
$ cd /var/www/html
```

インターネットからNextCloudをダウンロードして解凍します．

```bash
$ curl https://download.nextcloud.com/server/releases/nextcloud-13.0.1.tar.bz2 | sudo tar -jxv
```

解凍が終わったらそのディレクトリに移動し，dataフォルダを作ります．デフォルトではここにメディアサーバのデータが保存されます．

```bash
$ cd nextcloud
$ sudo mkdir data
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/187083/e2e6a478-b337-fc70-e712-ed59bb284971.png">

最後に，各種ファイルとフォルダのアクセス権限を編集しておきます．``www-data``とはApacheのデフォルトのユーザー（とグループ）です．
これでNextCloudのインストールは完了です．

```bash
$ sudo chown www-data:www-data /var/www/html/nextcloud/data
$ sudo chmod 750 /var/www/html/nextcloud/data
$ sudo chown www-data:www-data config apps
```

## MariaDBのインストール
MariaDBをインストールします．

```bash
$ sudo apt-get install mariadb-client mariadb-server
```

インストールが完了したらDBの初期設定をしていきます．
MariaDBのモニター画面に入ります．

```bash
$ sudo mysql -u root -p
```

次にNextCloud用のDBを作成します．

```sql
CREATE DATABASE <db-name>;
```

データベースを利用するユーザーとパスワードを作成します．

```sql
CREATE USER '<db-username>'@'localhost' IDENTIFIED BY '<db-userpass>';
```

作成したユーザにDB管理の権限を与えます．

```sql
GRANT ALL PRIVILEGES ON <db-name>.* to '<db-username>'@'localhost';
```

コンソールから権限をフラッシュさせて，MariaDBを終了します．

```sql
FLUSH PRIVILEGES;

quit
```

## 外付HDDの設定
デフォルトだとメディアサーバのデータはRaspberryPi本体に挿入したMicro SDに保存されてしまうのでこれを外付HDDに変更します．

まずは外付HDDをLinuxのファイルシステム<b>ext4</b>でフォーマットします．このとき<font color=#ff0000>HDDに保存されているデータは消去される</font>ため事前にバックアップ等しておく事をお勧めします．
HDDのフォーマットは``fdisk``や``parted``でできますが，``fdisk``は2TB未満のパーティションしか作成できません．今回は3TBのHDDをフルに利用したいので``parted``を使いました．

最初にRaspberryPiにHDDを接続して，``df``コマンド等で接続したHDDのデバイス名を確認しておきます．

```bash
$ df
```

以降はHDDの初期マウント先が``/dev/sda``であったものとして解説を続けますので，``/dev/sdb``などマウント位置が異なる方はその都度読み替えてください． 

それではHDDをフォーマットします．
まずはGNU partedを使って既存のパーティションを消去し，新しくパーティションを作ります．以下を参考にしてください．

```bash
$ sudo parted /dev/sda

GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel
New disk label type? gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y

(parted) mkpart
Partition name?  []? nextcloud
File system type?  [ext2]? ext4
Start? 0%
End? 100%

(parted) print
Model: TOSHIBA External USB 3.0 (scsi)
Disk /dev/sda: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 
Number  Start   End     Size    File system  Name       Flags
 1      1049kB  3001GB  3001GB  ext4         nextcloud

(parted) quit
```

続いてHDDをext4でフォーマットします．

```bash
$ sudo mkfs.ext4 /dev/sda
```

次にHDDをマウントするフォルダを作ります．``/media``か``/mnt``に作成するのが一般的だと思います（諸説あり）．

```bash
$ sudo mkdir /media/hdd0
```

マウント先を変更します．

```bash
$ sudo mount /dev/sda /media/hdd0
```

ディスク容量の確認で，適切な位置にマウントされているかどうか確認してみてください．

```bash
$ df
```

次にHDDが自動マウントされるように設定します．

```bash
$ sudo blkid /dev/sda
```

表示されるUUIDをコピーしておいてください．

一応バックアップを作成してから``/etc/fstab``を編集していきます．

```bash
$ sudo cp /etc/fstab /etc/fstab_backup
$ sudo vi /etc/fstab
```

最後の行に以下のように追記して保存してください．

```fstab
# HDD for NextCloud
UUID=******** /media/hdd0 ext4 defaults,noatime 0 0
```

HDDを接続したままRaspberryPiを再起動して，HDDが所定の位置にマウントされていれば完了です．

```bash
sudo shutdown -r now
```

```bash
$ df
```

最後に，マウントしたHDDにデータの保存環境を構築します．
``.ocdata``を作成し，アクセス権限を編集します．

```bash
$ sudo chown www-data:www-data /media/hdd0
$ sudo touch /media/hdd0/.ocdata
$ sudo chown www-data:www-data /media/hdd0/.ocdata
```

## NextCloudの設定
Chromium等のブラウザから``http://localhost/nextcloud``にアクセスしてNextCloudの初期設定をしていきます．

PHP関係で足りないものがあると怒られます．必要なものを入れてあげてApacheを再起動しましょう．

<img src="https://qiita-image-store.s3.amazonaws.com/0/187083/9e866913-b22c-05e3-c74c-a22ded6372ac.png">

```bash
$ sudo apt-get install php7.0-mysql php7.0-pgsql php7.0-zip php7.0-dev php7.0-mbstring php7.0-gd php7.0-curl
$ sudo service apache2 restart
```

NextCloudが起動します．初回起動時は管理者アカウントのユーザー名とパスワードを設定する必要があります．
データフォルダには外付HDDをマウントした位置を，データベースのユーザー名，パスワード，データベース名にはそれぞれMariaDBの設定の際に作成したものを入力します．

<img src="https://qiita-image-store.s3.amazonaws.com/0/187083/a6499a6f-f2fe-8d2a-a086-0eafb11896ae.png">

「セットアップを完了します」をクリックしてNextCloudのセットアップは終了です．

# NextCloudを使ってみる
NextCloudのメディアサーバにアクセスするときは``http://<ラズパイのIPアドレス>/nextcloud``です．

Raspberry PiのIPアドレスは

```bash
$ ifconfig
```

```bash
$ ip route
```

などで確認できます．

また，最初にIPアドレス直打ちでアクセスしようとすると以下のエラーが出ることがあります．

```
Access through untrusted domain

Please contact your administrator. If you are an administrator, edit the "trusted_domains" setting in config/config.php like the example in config.sample.php.
Depending on your configuration, this button could also work to trust the domain:

"192.xxx.xxx.xxx" を信頼するドメイン名に追加
```

``config.php``を開いて'trusted_domains'を編集してください．

```bash
$ sudo vi /var/www/html/nextcloud/config/config.php
```

```config.php

  'trusted_domains' =>
  array(
    0 => 'localhost',
    1 => '192.xxx.xxx.xxx',
  ),

```

これでNextCloudからHDDにアクセスできるようになりました．お疲れ様でした．

# その他
## ファイルスキャン
フォーマットしたデータ保存用のHDDに大量のデータを入れたいときNextCloud経由でアップロードすると膨大な時間がかかってしまいます．このような場合，予めHDDにデータを全部入れた後にファイルを総スキャンしてDBに登録する方法がオススメです．

今回はexFATのHDDからデータをコピーしたかったのですが，LinuxはデフォルトではexFATをマウントできないので，最初にexFAT周りのパッケージをインストールしました．

```bash
$ sudo apt-get install exfat-fuse exfat-utils
```

NextCloudのデータ保存先である``/media/hdd0/<nextcloud-username>/files``にデータをコピーします．

次にファイルの所有者をwww-dataに編集します．

```
$ sudo chown -R www-data:www-data /media/hdd0/<nextcloud-username>/files
```

最後に，ファイルを総スキャンします．

```bash
cd /var/www/html/nextcloud/
sudo -u www-data php occ files:scan <nextcloud-username>
```

再びNextCloudにアクセスすると，ファイルが追加されています．

## IPアドレスの固定
RaspberryPiを再起動する度にIPアドレスが変わるとメディアサーバにアクセスしにくいため，IPアドレスを固定します．

最初に，ルーターの設定画面にアクセスしてDHCPサーバのアドレス範囲を確認します．固定IPアドレスを割り振る場合はこの範囲外に設定する必要があります．



固定IPアドレスを設定したら``config.php``を更新してください．

# 終わりに
ラズパイ上でNextCloudを動かして，外付HDDを使用したプライベートメディアサーバを構築することができました．ラズパイとHDDを常時電源に接続しておく必要がありますがそれほど消費電力が多いわけでもありませんし，複数の端末からHDDにアクセスできるのは結構便利だと感じています．ただ，少し遅いと感じることも…

今回は自宅でしか使用しないプライベート用ということで設定をしましたが，そのうちポート開放，ドメイン取得，SSL化して外部からもアクセス可能にしようと思っています．

本記事に関して誤りの指摘や改良案，質問等ありましたらなんでもコメントください．閲覧ありがとうございました．

# 参考
* [
RaspberryPiでNextCloud構築](https://skyblock.jp/2018/02/01/raspnextc/)
* [How to Setup a Raspberry Pi Nextcloud Server](https://pimylifeup.com/raspberry-pi-nextcloud-server/)
* [ownCloud コマンドラインツールによるファイルスキャン](https://qiita.com/katz_engineer/items/6ec5bcb60b96902aafd6)
* [Raspberry Pi に固定IPアドレスを割り当てる方法（Raspbian Jessie）](https://qiita.com/MarieKawasuji/items/b088ffb252a92eee8f5d)