RaspberryPI4をサーバーにして遊び倒す。その２



この記事は Voicy Advent Calendar 2020 の 19日目の記事です。
前日は @somen440 さんの[[golang] オーケストレーションベースのサーガパターンに優しく入門する。](https://qiita.com/somen440/items/a6c323695627235128e9)でした。明日は, @moonum さんの 〜 です。

#はじめに
この記事は11日目のこちらの記事の続きです。[RaspberryPI4をサーバーにして遊び倒す。その１](https://qiita.com/miyukiaizawa/items/99da331359eaf4c7eec7)
RaspberryPi4をサーバーにして運用してみようという内容ですが、前回は、RaspberryPi4にOpenmediavaultを導入して、NASの設定をするところと、サーバーの構築のためにDockerのインストールをするところまですすめました。
今回は、インストールしたDockerを使って、クラウドストレージとストリーミングサーバーを構築するところまで書きます。





#クラウドストレージ
今回はクラウドストレージには、[NextCloud](https://nextcloud.com/)を使います。
NextCloudはOSSなので利用料金はかかりませんし、外部ストレージ連携機能もあるので、既存のストレージも有効活用できることが大きなメリットです。

###導入準備
dockerのセッティングでPGIDとPUIDが必要になるので、SSHでRaspberryPiにログインして、PGIDとPUIDを調べます。
デフォルトのアカウントとホスト名であれば

```sh
ssh pi@raspberrypi.local
```
で接続できます。

接続したら、idコマンドで確認します。uidをPUID、gidをPGIDで使用します。

```sh
id
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),109(netdev),111(ssh),997(gpio),998(i2c),999(spi)
```

###インストール
NextCloudのインストールには、まずNextCloudでつかうDBをセットアップする必要があります。
DBにはMariaDBをつかっていきます。

DockerHubから、MariaDBとNextCloudのDocker-composeを入手します。
https://hub.docker.com/_/mariadb
https://hub.docker.com/_/nextcloud/

上記URLのDocker-composeを参考に書いていきます。

ポイントは下記４点です。
・Portainerは、__version2__のdocker-composeまでしかサポートしないので、__version2__を使用。
・前回でx64のOSをインストールしたので、Imageは、__arm64v8__ を使用。
・NextCloudとMariaDBは__ブリッジモード__で__同じネットワーク__を使用。
・__PUID__と__PGID__を正しく設定する。
・データベース名と、そのデータベースを参照するユーザーを作成。

基本的には上記が満たされていれば大丈夫です。
細かいConfigの設定などは、DockerHubのページを参考に個人のお好みで設定してください。

volumesでBindするフォルダは好きに設定してかまいませんが、今回はOpenmediavaultで設定した共有フォルダ下記にBindしています。
RaspberryPiの本体の容量の問題もあるので、十分容量があるストレージのディレクトリを指定してください。

__docker-comose__で__データベース__、__データベースを参照するユーザー__を設定している場合は必要ありませんが、設定してない場合は、DockerのMariadbにログインしてデータベース作成とそのデータベースを参照するユーザーを作成してください。


```yaml:docker-compose.yml
version: '2'

services:
  nextclouddb:
    image: linuxserver/mariadb:arm64v8-latest #arm64v8を使用
    container_name: nextclouddb
    restart: always
    networks:
      - my-net #nextcloudと同じネットワークを使用
    volumes:
      - /srv/dev-disk-by-label-App/AppData/nextclouddb:/config #Configを共通フォルダ（外部ストレージ）にバインド
    ports:
      - "3306:3306/tcp"
    environment:
      PUID: 1000 #idコマンドからUIDを使用
      PGID: 1000 #idコマンドからGIDを使用
      TZ: Asia/Tokyo #自身の環境に合わせて設定
      MYSQL_DATABASE: nextclouddb #データベース名
      MYSQL_USER: raspberrypi #MYSQL_DATABASEを参照するユーザー名
      MYSQL_PASSWORD: password #MYSQL_USERのパスワード
      MYSQL_ROOT_PASSWORD: openmediavault #管理者のパスワード

  nextcloud:
    image: linuxserver/nextcloud:arm64v8-latest #arm64v8を使用
    restart: always
    container_name: nextcloud
    networks:
      - my-net #nextclouddbと同じネットワークを使用
    volumes:
      - /srv/dev-disk-by-label-App/AppData/nextcloud:/config #Configを共通フォルダ（外部ストレージ）にバインド
      - /srv/dev-disk-by-label-Media/nextcloud:/data #クラウドストレージのデータ用のディレクトリを共通フォルダ（外部ストレージ）にバインド
    ports:
      - "8080:80/tcp" #80ポートはOpenmediavualtが使用しているので、別のポートを指定
      - "444:443/tcp" #443ポートも他が使う可能性があるので、別のポートを指定
    environment:
      PUID: 1000 #idコマンドからUIDを使用
      PGID: 1000 #idコマンドからGIDを使用
      TZ: Asia/Tokyo #自身の環境に合わせて設定
    depends_on:
      - nextclouddb #nextclouddbが起動してからnextcloudを起動
      
networks:
  my-net:
    driver: bridge #ブリッジモードでネットワークを作成
```

### インストール
前回インストールしたPortainerにログインし、左ペインのStacksからセットアップしていきます。
Add Stackを開きます。

![スクリーンショット 2020-12-20 090516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/aff19bf2-3dca-9d8f-b1f9-d871dc5062f5.png)

Nameを設定して
Web editorに先ほどのdocker-composeを張り付けます。

![スクリーンショット 2020-12-20 090622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/0d087a25-bf22-fe7a-caec-a8207c4331c7.png)

Deploy the stackを押してデプロイします。

![スクリーンショット 2020-12-20 090831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/f809c894-4648-56ac-ff78-71040b5156c6.png)

正しくデプロイされれば、Containerが追加されます。
![スクリーンショット 2020-12-20 091024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/be603bbb-cb2d-6d73-048a-0ce762b18524.png)

Contaierの一覧は左ペインのContainersから確認できます。
![スクリーンショット 2020-12-20 081858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/706b37d7-d37b-7520-c911-477158dd3ef6.png)


## 初期設定
ブラウザからNextCloudにアクセスします。httpsで接続してください。
docker-composeでhttpsのポートを444でセッティングしたので、ポートを指定する際には444でつないでください。

```sh
https://{IPアドレス or Host名}:444
```

SSL証明書のセッティングをしていないので、アクセスの際に注意が出ますが、気にせず進んでください。
![スクリーンショット 2020-12-20 092957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/ef4e68fb-364e-e964-cc06-51fcf1c48c51.png)


NextCloudに接続できたら、初期設定画面から、下記３点を設定してください。
・管理者アカウントとパスワード
　　自分の好きなものを入力してください。

・データフォルダ
　　__/data__を指定してください。
　　__/data__のディレクトリを変更したければ、Docker-composeのvolumesから__/data__を任意のディレクトリにバインドしてください。

・データベース
　　__MySQL/MariaDB__を選択してください。
　　上から、アカウント名、パスワード名、データベース名、データベースのホスト名を指定してください。
　　アカウント名、パスワード名、データベース名はdocker-composeで設定したものを使用してください。
　　データベースのホスト名には、RaspberryPi本体のIPアドレスをしていしてください。

![スクリーンショット 2020-12-20 093442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/dc9b2a42-e07d-9acf-79e0-29275dd06360.png)


すべて設定し終わったら、__セットアップを完了します__を押します。
アカウントが既に存在するとエラーがでる場合には、初期設定が終わった後にまたアカウント設定ができるので、とりあえず別のアカウント名を指定してみてください。

![スクリーンショット 2020-12-20 094044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/798a32ca-c7c9-d215-91a0-3b61321a5126.png)

NextCloudが初期化を完了するまでしばらく待ってください。
5~15分くらい時間がかかります。

途中で504 Gateway Time-outになることがありますが、内部で処理は進んでいるので大丈夫です。
適度にリロードしてください。完了すれば、下記のような画面がでます。
ログイン画面がでたら、初期設定で設定したアカウント名とパスワードを使ってログインします。


![スクリーンショット 2020-12-20 094641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/b90ce6d1-ff84-2ecc-4c3a-bf3de37ea2e9.png)

ログインしたら、ダッシュボードが表示されるので、左上のタブからフォルダを選択してください。
![スクリーンショット 2020-12-20 095330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/6558ad7c-a22d-83b1-a0b7-dfd357d39953.png)

ストレージにアクセスできました。
![スクリーンショット 2020-12-20 095428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/9ed9670c-7174-fb8d-96f1-117bebdfd29b.png)


###　外部ストレージの連携設定
Openmediavaultで構築したNASの共有フォルダをNextCloudで使えるように設定します。
管理者アカウントでログインしてください。

右上のアカウントアイコンからアプリを選びます。
![スクリーンショット 2020-12-20 101515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/38724432-ff2a-e332-1264-7d1aba5f0154.png)


一覧から__External storage support__を検索し、有効にします。
![スクリーンショット 2020-12-20 102142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/b2331e7e-544f-b447-fd13-b0e537620dd9.png)


プラグインを有効にすると、設定画面の管理者項目に__外部ストレージ__の項目が追加されます。
ストレージを追加から、SMB/CIFSを選択します。
詳細設定が現れるので、フォルダ名を設定します。

詳細設定では、OpenmediavaultでのNASの構築で設定した共有フォルダを設定します。
認証は、ユーザー名とパスワードを指定し、Openmediavaultで設定した共有フォルダのアクセス権限があるアカウントを指定します。
すべて設定し終わったら、一番右のチェックボタンをクリックします。
接続に成功したら、左に緑のチェックマークが現れます。

最後に__ユーザーに外部ストレージの接続を許可する__をチェックします。

![スクリーンショット 2020-12-20 104854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/11f79c3a-4682-b783-8e1d-72a9c2520635.png)

フォルダ一覧に、さきほど外部ストレージが表示されれば成功です。
アイコンがショートカット風になっているので、それを参考にしてください。
![スクリーンショット 2020-12-20 105042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/85095746-5c6b-c4aa-3b17-d81fd763cdc0.png)


以上で、NASで共有したデータフォルダを、クラウドストレージからも利用することができるようになりました。
クラウドストレージの設定は以上で終了です。

#ストリーミングサーバー
NextCloudにも簡易的なストリーミング機能はあるのですが、せっかくなのできちんとし１たストリーミングサーバーを導入してみます。
今回は、ストリーミングサーバーにはPlexを使用します。

###インストール
DockerHubから、PlexのDocker-composeを入手します。
https://hub.docker.com/r/linuxserver/plex

上記URLのDocker-composeを参考に書いていきます。

ポイントは下記３点です。
・Portainerは、__version2__のdocker-composeまでしかサポートしないので、__version2__を使用。
・前回でx64のOSをインストールしたので、Imageは、__arm64v8__ を使用。
・ストリーミングしたいファイルがあるストレージをVolumesでバインドする

基本的には上記が満たされていれば大丈夫です。
細かいConfigの設定などは、DockerHubのページを参考に個人のお好みで設定してください。
ストリーミングしたいファイルが複数のストレージにある場合には、それぞれ任意のディレクトリ名でBindしてください。

```yaml:docker-compse.yml
version: '2'

services:
  plex:
    image: linuxserver/plex:arm64v8-latest
    container_name: plex    
    restart: always
    network_mode: host
    volumes:
      - /srv/dev-disk-by-label-App/AppData/plex:/config
      - /srv/dev-disk-by-label-Movie1/TV:/tv
      - /srv/dev-disk-by-label-Movie1:/movies
      - /srv/dev-disk-by-label-Movie2:/movies2
    ports:
      - "32400/tcp"
    environment:
      PUID: 1000
      PGID: 1000
      VERSION: latest

```

上記の、docker-composeをPortainerのStackに追加してContainerをデプロイします。（NextCloudの導入を参考）

###初期設定
ブラウザからPlexにアクセスします。Web-UIのURLは下記のとおりです。

```
http://{HostName}:32400/web/index.html
```

アクセスするとログイン画面が現れるのでログインしてください。
アカウントの登録をしていない人は登録してください。

![スクリーンショット 2020-12-20 111432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/e8be5504-a397-7faa-1092-e69a1de8cbfa.png)


ログインに成功すると下記の画面が現れます。
![スクリーンショット 2020-12-20 111615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/cc8f0f0c-81a8-36ab-33ba-d8add0bd208d.png)

###ライブラリーの追加
右上のアカウントアイコンからアカウントメニューを選択。
左ペインから管理→ライブラリを選択し、設定画面から、ライブラリーを追加のボタンを選択します。
次に、ライブラリーの種類を選択します。
次に、フォルダを追加します。メディアフォルダーを見るのボタンを選択し、Docker-compseのVolumesでバインドしたフォルダ以下からストリーミングしたいファイルの入っているフォルダを指定します。

すべて設定し終わったら、ライブラリーに追加を選択します。

![スクリーンショット 2020-12-20 112343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/82e074a2-191e-8723-ca1c-0a9f945c976e.png)

###リモートアクセスの設定
アカウント→設定→リモートアクセスの画面で、リモートアクセスを有効にすることで、外部からPlexにアクセスできるようになります。
設定はリモートアクセスを有効にするを押すだけです。

![スクリーンショット 2020-12-20 112636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887071/90079eb8-9954-3bc0-7474-d8889d85bee8.png)

独自ドメインの設定をする場合は、リモートアクセスは無効にした状態で、
アカウント→設定→ネットワークから、カスタムドメインを設定します。



以上で、Plexの設定は終了です。

#さいごに
クラウドストレージの方は、ドメインの設定をしてサーバーを外部公開すれば、NASを外出先からでも利用できるようになるので、大変便利です。
Dockerを使って、他にもいろいろなサーバーを構築して遊べるので、RaspberryPiの使い道で迷った際には、参考にしてください。