[NextColoud] ラズパイを使って外付けHDDで無料のファイルサーバー構築 

### 初めに
---
普段はDropBoxやGoogleDriveを使っていましたが、いずれ容量制限に引っかかることを考えると、スマホやPCのデータを集約したり、外部からアクセス可能な自前のファイルサーバーが欲しくなります。

今回はまずラズパイを使って、`ホームネットワーク内`にファイルサーバーを構築する話になります。

使用するのはオープンソースの`NextCloud`というソフトです。

### 環境
---
・RaspberryPi4 armv7l (固定IP設定済)
・raspbian ver.10 buster
・Docker＆Docker Compose
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/6bc27e74-fc6d-f517-41b3-4ab812e5e187.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/8a6a5e56-fdac-a85e-5f08-736410349db9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/85c6e286-64e4-d0e0-1b4d-5bde2f5bdf91.png)


### Docker Engineのインストール
---
nextCloudは”直接インストール”、”SNAP版”、”Docker版”と、色々セットアップ方法がありますが、今回はdocker版を使用します。

ここでふと、「そういえばSnapがDockerと違うのはわかるけど、Aptとの違いってなんだっけ？」となったので、下記のサイトで勉強しなおしました。
[「SnapとDocker」と「SnapとApt」のそれぞれの違いと使い方を徹底解説](https://wisenetwork.net/archives/2929)


まずDockerのインストールからですが、方法は公式そのままです。
公式ページをのぞいてみると、下記の通りちゃんとRaspbianに対応してますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/fd5b31bf-105f-856b-0551-83ece8fa6c22.png)

どうやら公式でおすすめの、スクリプトファイルを使ったインストール方法があるようなので、そちらを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/051c412d-62a4-551f-1628-64bf04998e8e.png)

https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script

下記をラズパイのターミナルで実行します。
```
 curl -fsSL https://get.docker.com -o get-docker.sh
 sudo sh ./get-docker.sh --dry-run
```
インストール出来たら、下記コマンドで確認します。
```
$ docker -v
```
また、Dockerコマンドの実行は毎回sudoが必要になり面倒なので、このタイミングでdockerグループに現在のユーザーを追加しておくことで、sudo付けずにDockerコマンドを実行できるようにします。
```
$ sudo usermod -aG docker [ユーザー名　初期ならpi等]
```
### Docker Engineのインストール
---
pipでインストールできるので、下記コマンドを打つだけです。

```
$ sudo pip3 install docker-compose
```
インストールが完了したら、下記コマンドで確認します。
```
$ docker-compose -v
```

### NextCloudをDockerで動かせるようにする。
---
外付けHDDはマウントの設定をする必要があります。
下記ページで非常に分かりやすく説明されていたので、ここでは割愛します。
マウントさえできれば、次のdocker-compose.yml内の設定で指定するだけです。
https://beightlyouch.com/blog/programming/raspberry-pi-hdd/#toc3


### NextCloudをDockerで動かせるようにする。
---
nextcloud用にディレクトリを作成し、
docker-compose.ymlを作成して、下記を記載します。
```
version: '3.8'


services:
  nextcloud_db:
    image: yobasystems/alpine-mariadb # ラズパイで動くmariadbのイメージ
    container_name: nextcloud_db
    ports:
      - 3306:3306 # 一旦そのままですが、外部に公開する場合は変更したほうが良いです。 
    volumes:
      - ./db:/config
      - ./db_backup:/backup
    restart: always # ラズパイ再起動時に自動で起動するようにする
    environment:
      - MYSQL_DATABASE=nextcloud # MySQLのデータベース名です。
      - MYSQL_ROOT_PASSWORD=1234 # MySQLの管理パスワードです。
      - MYSQL_PASSWORD=1234      # MySQLのユーザーパスワードです。
      - MYSQL_USER=nextcloud     # MySQLのユーザー名です
    networks:
      - mynet

  nextcloud:
    image: nextcloud
    container_name: nextcloud
    ports:
      - 8787:80 # 今回は8787ポートを使用して接続できるようにします。(任意)
    volumes:
      - ./html:/var/www/html
      - /media/extrnalHdd/nextcloud:/externalHdd # 外付けHddをマウントしたディレクトリをバインド設定しておきます。（こうすると後でNextCloud内から外付けHDDをデータベースとして設定できます。）
    restart: always
    environment:
      - MYSQL_DATABASE=nextcloud # MySQLと同じにします。
      - MYSQL_PASSWORD=1234      # MySQLと同じにします。
      - MYSQL_HOST=nextcloud_db  # dbのコンテナ名を指定します。
      - MYSQL_USER=nextcloud     # MySQLと同じにします。
    depends_on:
      - nextcloud_db
    networks:
      - default
      - mynet

networks:
    default:
      driver: bridge
      ipam:
        driver: default

    mynet:
      driver: bridge
      internal: true
      ipam:
        driver: default
```
作成出来たら、docker-composeを使ってnextcloudを含んだdocker環境をスタートさせます。
```
$ docker-compose up -d
```
無事成功すれば、ブラウザからNextCloudのホーム画面にアクセスできるようになります。
```
ラズパイから接続する場合は下記
http://localhost:8080

他のPCから接続する場合は下記
http://【IPアドレス】:8080
```
無事下記のような画面が出たら、そのまま画面に沿って登録します。
これで基本的なNextCloudの環境構築は完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/2509c1f4-bbeb-a141-a3e2-88569cd167e3.png)

### NextCloudで外付けHDDの設定
---
nextCloudのホーム画面右上のアイコンから、「アプリ」を選択し、「external Storage support」を有効化します。
その後左側に「外部ストレージ」が追加されますので、設定画面で”ローカル”と”先ほどdocker-compose内でバインドした外付けHDDの場所”を設定することで、使用可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/3bf8a1f6-551c-724c-9db1-877794d033fe.png)

### おわりに
---
今回はラズパイを使ってお手軽に外付けＨＤＤをファイルサーバーを構築する方法を紹介しました。オンプレ環境の構成になりますので、外部に公開する場合はもうひと設定必要になります。