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


概要

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

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

※https対応が未完了です

できること

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

Nextcloudでできること

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

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

 

  • ファイルの共有リンク作成

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

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

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

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

環境

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

Step1.RaspberryPiOSのインストール

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

Raspberrypi imager を起動し Operating Systemを選択する

Raspberry PI OS(Other)を選択

Raspberry PI OS Full (32-bit)を選択

Storageを選択し、インストールしたいSDカードを選択する

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

参考ページ

Step2.起動~初期設定

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

Step3.IPアドレスの固定

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

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

sudo nano /etc/dhcpcd.conf

エディタで設定ファイルを編集し保存 (保存:Ctrl+x → y → enter)
その後再起動(参考ページでは再起動なしでも良いように読めたが筆者の環境では反映するために再起動が必要だった)
=の後にスペース等いらない文字が入っていると設定がうまく行かないので注意。

筆者の環境ではIPアドレスを確認する[ipconfig]コマンドが使えなかったため[ip route]を使用(ipconfigは現在非推奨らしい)

必要に応じてvnc or sshで接続して作業をすすめる

参考ページ
筆者はスクショを取りたかったのでvnc接続して進めました

Step4.新規ユーザの作成→piユーザの削除

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

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

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

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

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

エラー画面

修復~マウント

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

sudo blkid -c /dev/null

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

sudo nano /etc/fstab

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

  • 参考ページ

メイン参考ページ

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

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

nofailについて

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

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

Step7.nextcloudのインストール

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

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

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

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

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



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

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

  • アドレスを打ち間違えている
  • アドレスがあっている場合、windowsPCでpingを打ってみる(ping ドメイン名)

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

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

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

アイスブレイク:SDカードのバックアップ

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

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

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にアクセスできることを確認する

参考ページ

Step10.https対応 ~ 工事中

なかなかうまく行かないので、お試しがてらhttpで運用中

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

Step11.windowsクライアントアプリをインストール~ファイル共有

下記ページを参考に実施。

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

おまけ

  • コマンドラインでのユーザの作成

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

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

おわりに

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