raspberrypiでnextcloudを使ってオンラインストレージサーバを立てる(外部アクセス可)

##概要
外部から接続できる自前のオンラインストレージサーバを立てられた方法を記録します
様々なサイトにお世話になりながらかなり失敗しつつも、リンク先の皆様のおかげでなんとかなりました。感謝！。

なおラズパイを始めて1ヶ月位の初心者なので、至らぬ所あるかと思いますがご容赦を。
セキュリティ上問題があるのでは？というような内容がありましたらぜひ教えて下さい。

※https対応が未完了です

##できること
- ランニングコストがフリーで外部からアクセス可能なNASサーバを立てられる<br>
（DDNSの無料期間は1年＆電気代はかかるよ。外部＝携帯の4G回線等)<br>
  4TBのオンラインストレージを借りようと思うとだいたい月額1500円～。年18000円と考えて、HDD=1万、ラズパイ5000円と考えれば１年位でペイしそう(電気代は500円/年くらい？)
- 速度は30-40Mbpsくらい(筆者の回線は100Mbpsが最大なのでこれがキャップになっている？)

##Nextcloudでできること

- ファイル・フォルダの共有管理

DropboxやGoogleDriveのようにWindowsのファイルシステム上で簡単に共有フォルダが管理できます
実施例↓

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/00114a16-bbb8-2452-61f2-3d98b5e880c0.png)

- ファイルの共有リンク作成
 
 オンラインストレージにあるファイルに共有用のリンクを作成できます
　実施例↓

リンクにパスワードを掛けたりもできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/53db7537-5eb4-1703-5c3f-b21ef8e919b4.png)


- ユーザの複数作成とファイルへのアクセス権付与

他、アプリが様々用意されているので多機能です！

##環境

- Raspberrypi 3B+ （本当は4bがいいのだけれども余ってなかった)
- Windows10 デスクPC
- HDD 4TB (windowsにもつなげたいのでexfatにしました　※苦戦しました笑)
- ルーター
- 光回線
- LANケーブル他アクセサリ類

##Step1.RaspberryPiOSのインストール
公式サイトから Raspberrypi Imagerをダウンロード→PCへインストールする

https://www.raspberrypi.org/software/

Raspberrypi imager を起動し　Operating Systemを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/6a7bcc45-e242-e269-b820-500c9516a626.png)

Raspberry PI OS(Other)を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/cba51a30-f51b-b7aa-5c19-3b95867ffb52.png)

Raspberry PI OS Full (32-bit)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/5d14bebe-14b3-345c-1e04-6679b92fe3c3.png)

Storageを選択し、インストールしたいSDカードを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/565fe314-a4e5-7c5a-9b39-0381ad670a7f.png)

Writeボタンが押せるようになるので押してROMを焼き込む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/d9bc6129-f5e4-1b76-74a9-44fec2515bf3.png)

参考ページ

https://qiita.com/karaage0703/items/79e09db0ef3ebcf94882

#Step2.起動～初期設定
下記ページの流れで起動～初期設定まで実施。再起動。

https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-setup/

##Step3.IPアドレスの固定
下記ページを参考にIPアドレスを固定する

設定ファイルを次のコマンドで開く

```
sudo nano /etc/dhcpcd.conf
```


エディタで設定ファイルを編集し保存 (保存:Ctrl+x → y → enter)
その後再起動(参考ページでは再起動なしでも良いように読めたが筆者の環境では反映するために再起動が必要だった)
=の後にスペース等いらない文字が入っていると設定がうまく行かないので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/7e3435cf-60b8-a420-5718-e67d54bd0048.png)


筆者の環境ではIPアドレスを確認する[ipconfig]コマンドが使えなかったため[ip route]を使用(ipconfigは現在非推奨らしい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/630debf8-8d8d-e97c-c512-a3db4d6630cc.png)


https://mugeek.hatenablog.com/entry/2019/05/27/230256

##必要に応じてvnc or sshで接続して作業をすすめる
参考ページ
筆者はスクショを取りたかったのでvnc接続して進めました

https://qiita.com/b-wind/items/d33f759ace01658bb09e

##Step4.新規ユーザの作成→piユーザの削除
セキュリティ対策のため下記ページを参考に新規ユーザを作成しpiユーザを削除する
piユーザを削除する前に一度(ログアウトではなく)再起動しておく

https://debimate.jp/2020/09/01/%E3%80%90%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E7%AD%96%E3%80%91raspberry-pi4%E3%81%AB%E6%96%B0%E8%A6%8F%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97/


##Step5.HDDのマウント(exfat)～起動時の自動マウント

※ext4で十分な場合はフォーマットを読み飛ばしてください

dfコマンドでファイルシステムの一覧を表示し
目的のhddのファイルシステム(今回は/dev/sda2)をメモしておく


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/50daec8b-d74b-64a1-47c7-745c9cce6bd7.png)

exfatでフォーマットしたりするための環境を導入する

```
sudo apt install exfat-fuse exfat-utils
```

フォーマットしてマウントする(/dev/sda2は環境に合わせて読み替えてください)

```
mkdir /media/hdd1
sudo mkfs.exfat /dev/sda2
sudo mount /dev/sda2 /media/hdd1
```

下記のエラーが出た場合には次のコマンドで修復し、マウントします

```
sudo fsck -a /dev/sda2
```

エラー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/b6bfd354-1ef0-5cc9-154f-c0b43aa26697.png)

修復～マウント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/22698af4-32a2-eaa6-c721-7fd369520357.png)

マウントしたhddのUUIDを確認する
UUID=以降の8桁のUUIDをメモしておく

```
sudo blkid -c /dev/null
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/5e41df7f-21d9-07d7-66a0-c2f0bee6b631.png)

起動時に自動マウントするよう下記の通り設定する(間違えると起動しなくなるので注意)

```
sudo nano /etc/fstab

#下記を末尾に追加(XXXX-XXXXは先にメモしたIDで読み替えてください)
UUID=XXXX-XXXX /media/hdd1 exfat defaults,noatime,nofail 0 0
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/969bf811-a899-8c98-f067-6fcf4fc16d4c.png)


- 参考ページ

メイン参考ページ

https://qiita.com/pira/items/10efe9e93cbf13e1617f

exfatのマウントに失敗した場合

https://ubuntu.buildwebhost.com/ja/q/74609

blkidでuuidが表示されない場合

https://pentan.info/server/linux/blkid_uuid_not_display.html

nofailについて

https://qiita.com/nishemon/items/a967b950c4bbca08fd88

#Step6.ドメインの取得(DDNS)

下記ページを参考にDDNSを取得する
例えば、testserver.ddns.netのような名前でドメインを取得する

https://tarufu.info/domain_acquisition_no-ip/

#Step7.nextcloudのインストール
下記ページを参考にnextcloudをインストールする
※この方法だとほかサイトに書いてあるようなDBの設定が不要でめっちゃ楽。有り難い。ドメイン名には[ドメインの取得]で取得したドメイン名を使用する

https://www.my-hacks.info/2020/03/05/post-1032/

※Dependencies not found.が表示された場合
下記ページを参考に足りていないパッケージを導入する
パッケージ入れてもダメな場合についても記載がある

https://ararabo.com/2019-03-12/?p=9333

#Step8.ファイアウォールの設定とポートの開放

下記ページのファイアウォール設定とポートの開放を実施する
ポートの開放については、各ルータによって異なるので
ポートフォワーディング＋ルータ名などでググるか、それっぽい場所を頑張って探す
ルータによっては機能がない？場合があるので注意。筆者が所持しているbuffaloのWSR-1166DHPには設定項目がありませんでした。光回線のモデムに機能があって事なきを得た。。。

https://tarufu.info/nextcloud-setup/

この時点でうまく行っていれば携帯の4G回線などから
http://ドメイン名/nextcloud
で外部からアクセスできログイン画面が表示されるはず

<br><br>※最初はこちらのサイトに従ってNextcloudをインストールしようとしたのですが、nextcloud.xxx系が実行できず断念。環境の問題？

★ログイン画面が表示されない場合

- アドレスを打ち間違えている
- アドレスがあっている場合、windowsPCでpingを打ってみる(ping ドメイン名)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/50068e04-97dd-e419-07d9-d867e01f0006.png)

　→pingが通る場合、下記で治る可能性あり
　→pingが通らない場合、おそらくルータの設定が間違っているので見直す

```
sudo nano /etc/apache2/sites-available/000-default.conf
# ServerNameに取得したドメイン名を記入する
ServerName testserver.ddns.net
# apache2を再起動する
$ sudo systemctl restart apache2
```

↑トラブルシューティングで参考にしたページ

https://linuxfun.org/2021/02/24/raspberry-pi-4-original-domain-name/

#アイスブレイク：SDカードのバックアップ
　色々設定したときに、うまく動かなくなって戻せなくなってしまうことがままある。ので、SDカードのバックアップを取っておこう。（筆者は命拾いした

かかる時間はSDカードのRW速度次第。筆者の32GBのSDカードで30分かかった(遅い

https://raspi.taneyats.com/entry/backup-sdcard

note:SDカードをPCにマウントしたときに、フォーマットしますか？と聞かれるドライブに書き込もうとしたら書き込めなかった。マウントしたときにファイルが表示されるドライブに書き込むのが正解？筆者はSDカードを一旦フォーマットしてから書き込んだ。フォーマットするときもファイルが表示される方でないとフォーマットできなかった。

#Step9.HDDドライブをデータの保存先にする＆パーミッションの変更

HDDドライブをデータの保存先にする

```
sudo cp -r /var/www/html/nextcloud/data /media/hdd1

sudo nano /var/www/html/nextcloud/config/config.php

#開いたら
'datadirectory' => '/var/www/html/nextcloud/data'
#を
'datadirectory' => '/media/hdd1/data'
#に変更する
```

パーミッションを変更する
これをやらないと「データディレクトリは、他のユーザーから読み取り専用です。ディレクトリが他のユーザーから見えないように、パーミッションを 0770 に変更してください。」と怒られる。

```
#gidの特定
cat /etc/group
#表示される一覧の中から
#www-dataを探し番号をメモする(gid)

#uidの特定
cat /etc/passwd
#表示される一覧の中から
#www-dataを探し番号をメモする(uid)

sudo nano /etc/fstab

#すでに追加してあるUUIDの項目を編集する
#色々なサイトのコピペで完成しているコマンドのため、正直いらないオプションありそう
UUID=XXXX-XXXX /media/hdd1 exfat defaults,noatime,nofail,async,auto,dev,exec,gid=YYY,rw,uid=ZZZ,umask=7,fmask=7,dmask=7 0 0
```

このままだと、www-dataがhddの所有者になりログインユーザなどからアクセスできなくなるため、www-dataグループにログインアカウント(と念の為root)を加えておく


```
sudo usermod -aG www-data ログインユーザ名
sudo usermod -aG www-data root
```

終わったら再起動して、nextcloudへログインできることとHDDにアクセスできることを確認する

参考ページ

https://kazmax.zpp.jp/cmd/m/mount.8.html

https://www.it-swarm-ja.com/ja/mount/%E3%80%8Cdmask%E3%80%8D%E3%81%8A%E3%82%88%E3%81%B3%E3%80%8Cfmask%E3%80%8D%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3/961637140/

http://asithink001.blogspot.com/2013/05/exfat.html

https://kazmax.zpp.jp/linux_beginner/etc_passwd.html

https://kazmax.zpp.jp/linux_beginner/etc_group.html

https://qiita.com/unikan/items/35af755de7a0b0346c02

#Step10.https対応 ～ 工事中
なかなかうまく行かないので、お試しがてらhttpで運用中

下記ページを参考に証明書を発行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/212f920c-c02d-bcb9-e443-3c934375ae5b.png)

https://diary.d-yoshi.com/?p=9402

https://teratail.com/questions/34049

https://marycore.jp/coding/htdocs-document-root/#httpd.conf%E3%81%AE%E5%A0%B4%E6%89%80%EF%BC%88OS%E5%88%A5%EF%BC%89

#Step11.windowsクライアントアプリをインストール～ファイル共有
下記ページを参考に実施。

ファイル共有が完了すると下記のようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433821/00114a16-bbb8-2452-61f2-3d98b5e880c0.png)


https://qiita.com/mmisu/items/df74e5ec9f917b7ba7ef

#おまけ
- コマンドラインでのユーザの作成

-uオプションはユーザ名指定
というのを知らなくて、webでよくある解説にsudo -u nginx php /...と書いてあるので実行しようとしてできなくて困りました。

```
sudo -u www-data php /var/www/html/nextcloud/occ group:add グループ名
```


#おわりに
　スマホやPCから自前オンラインストレージにファイルがアップできるようになりました
　正直参考サイトに書いてあるとおりになかなか進まなくて辛かったですが頑張った甲斐はあったかなと思っています
　サーバ周りは知識が殆どないのでしっかり勉強しようと思います！
　だいぶ長くなりましたが最後までお付き合い下さりありがとうございました。