前回は、Raspberry Pi OS を、4TBのRAID1 ボリュームから起動するように構成しました。何故か? と言えば自前のファイルサーバーその他諸々を構築したいから、ですね。
今回は主目的であるファイルサーバーを Nextcloud と Docker でお手軽に構築していきます。
Nextcloud とは?
オープンソースな Dropbox や OneDrive, Box のような高機能なストレージを実現する。Cloudと名前がついているものの、オンプレミスで会社や自宅にインストールすれば当然、クラウドストレージにはならない(当たり前)。
クライアントソフトとウェブインターフェースだけというのが主流のクラウドストレージサービスと異なり、webdavなど色々なプロトコルでファイルを共有できるのが魅力。また、使うかは分からないけれど、チャットやグループウェアといった機能も搭載されている。故障のリスクと扱える人材がいるなら、中小企業の IT システムの大半をお安く実現できそうな感じ。
複数のサーバーのアカウントを切り替えて使えるので、プロジェクトごとにサーバーを立てるといったことも可能。
Nextcloud のイマイチなところ
クライアントソフトの同期機能が、「コピー」だけなところ(2022年9月末現在・説明を読んだ限りでは)。大手クラウドストレージはオンデマンドな同期で、必要になるまでファイルをダウンロードしないのが主流になっていて、モバイル用途だと帯域逼迫などが起きないのでこの方がうれしい。SSDの寿命も気にしなくていいし。
説明が同期となっていますが、Nextcloud Client をインストールし、サーバー設定をする段階で「必要になるまでファイルをダウンロードしない」設定が選択できます。つまり全然イマイチじゃないです。
Docker のインストール
まだインストールしていなければ
sudo apt-get install docker.io
sudo usermod docker -aG $USER
sudo apt-get install docker-compose
sudo reboot
途中、何か聞かれたら y で。Docker はちゃんとやろうと(イメージ作ったり)すると多分とても大変なんですが、楽介のように楽をしたいだけの人からすると、色々なサーバーをお手軽に構築できる便利なツールという位置づけなので、こんな感じです。
Docker 本体と、構成を楽にしてくれる docker-compose をインストールし、現在のユーザーpi にdocker の起動許可を与えて rebootします。
Docker 上でNextcloud を動かす
再起動が終わったら、
mkdir nextcloud
cd nextcloud
として、ユーザー pi のホームディレクトリ /home/pi にnextcloud ディレクトリを作成、移動します。
Docker は仮想環境なので、root 権限が必要な特殊なディレクトリではなく、ホームディレクトリ内で作業を行います。
touch docker-compose.yml
nano docker-compose.yml
として、docker-compose.yml ファイルを作成、続けて nano で編集します。
docker-compose.yml は、Docker を起動するのに必要な、様々なオプションをまとめて記録して、(ただでさえ楽な)Docker によるサーバーの構築を楽にしようという仕組みです。
しかも、この docker-compose.yml はテンプレートが既に用意されているので、自分で書く必要がほとんどありません。
Docker Hub のNextcloudのページからコピペしてきて(開かなくてもいいように、以下にもコピペします)
version: '2'
volumes:
nextcloud:
db:
services:
db:
image: mariadb:10.5
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- /home/pi/nextcloud/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_PASSWORD=
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
image: nextcloud
restart: always
ports:
- 8080:80
links:
- db
volumes:
- /home/pi/nextcloud/nextcloud:/var/www/html
environment:
- MYSQL_PASSWORD=
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
このファイルの MYSQL_ROOT_PASSWORDと、MYSQL_PASSWORD(2箇所)を設定すれば動きます。PASSWORDなので、一応、ランダムで強固なものを設定した方がいいと思います。仮に、ルーター越しにサーバーを公開する予定があるなら、なおのことですが(仮想環境内に隔離されているので、大丈夫だとは思いますが)。
また、楽介はvolumes:… 以下にある設定を標準から少し変えています。
- db:/var/lib/mysql
(中略)
- nextcloud:/var/www/html
の2行を、
- /home/pi/nextcloud/db:/var/lib/mysql
- /home/pi/nextcloud/nextcloud:/var/www/html
と変更しています。
ここはバインドボリュームという設定で、仮想環境内のディレクトリを親のディレクトリにマウントします。こうしないと、データ類が再起動時に削除されてしまうためです。
: で挟んで前半が親の実環境、後半がDocker 内のパスとなっています。実環境を絶対パスにしたのは、実データ(特にnextcloudディレクトリ)がどっかにいかないようにです。
docker-compose.yml の記述が終わったら、保存してnano を閉じ、
docker-compose up -d
コマンドで Docker イメージを起動します。作業ディレクトリが docker-compose.yml と同じディレクトリでないと動作しないので注意します。
初回起動時には、記述された Docker を動かすためのダウンロードが行われるため、起動までに時間がかかります。
昔、Linuxをいじっていた楽介としては、設定やら依存関係やらきちんとしてmake とかしなくてもapt-get のようなパッケージマネージャーが、依存関係も含めてインストールしてくれるだけでも感動したのですが、この楽さは衝撃ですね……。いちいちダウンロードに行かなくてもいいので、ある意味ではGUIより楽です。ほぼスマホのアプリストアレベルですね。CLIなのに。
無事起動したら、ls コマンドでバインドボリュームがディレクトリ内に出来ていることを確認します。
Windows からブラウザでアクセスしてみる
Raspberry Pi OS インストール時にいじっていなければ、sshと同様にraspberrypi.localでNextcloud にアクセスできます。
ブラウザのアドレスバーに
http://raspberrypi.local:8080/
と入力し
こんな画面が表示されたら成功です。画面の指示通りに、管理者アカウントを作成しましょう。
Nextcloud の初期設定を行う
管理ユーザーを作成してログインすると、以下のように推奨アプリのインストールが推奨されます。
正直、一人で使うつもりなので別にいいかなぁとも思うのですが、一応、推奨アプリをインストールします(時間がかかります)。
完了すると、以下のようなダッシュボードが表示されます。
あれ? 肝心のファイルは? と思うかもしれませんが、ダッシュボードの左上の方に、小さく
フォルダのアイコンが出ています。これをクリックすることで、よくあるクラウドストレージなGUIに遷移します。
Nextcloud の初期設定
基本設定
ファイルのアップロードなどはすでの動作する状況ですが、基本的な設定を行って行きます。右上のユーザーアイコンメニューから、「設定」を選択します。
左のメインメニューに、沢山設定項目が出現しますが、「管理」以下にある「基本設定」を行います。
設定しておきたいのが、「バックグラウンドジョブ」とメールサーバー(SMTPサーバー)です。
バックグラウンドジョブは、初期ではAJAXが選択されていますが、これだとWeb GUIにアクセスしないとバックグラウンドジョブが動作しません。個人用途ではそこまでバックグラウンドジョブの必要性はないかもしれませんが、望ましい状況ではないので、Cron(おすすめ)を選択します。
管理ユーザーのパスワードを要求されるので、入力します。
これだけでは、cron は動作しないので、SSH でRaspberry Pi OSに接続します。
バックグラウンドジョブの実行方法、crontab の設定は公式ドキュメントにありますが、Docker 環境だとこのままでは動作しません(Docker 内でPHPでcron.phpを起動する必要がある)。
まずは、
docker exec --user www-data nextcloud_app_1 php cron.php
として、エラーメッセージが出ないことを確認します。エラーメッセージが表示される場合は、nextcloud_app_1 が動作していないと思われるので、
docker ps
コマンドを実行して、nextcloud イメージのプロセス名を確認します。
無事、実行が確認できたら、
sudo crontab -e
として、cron の設定ファイルを開きます。初回、crontab を実行した場合は好みのエディタを質問されます。
好みのエディタがある場合はそれでもいいですが、普段Linux を使っていない人は、1. のnano でいいと思います。このサイトでも、エディタは基本的にnano を使っています。
エディタが起動したら、ファイルの末尾に
*/5 * * * * /usr/bin/docker exec --user www-data nextcloud_app_1 php cron.php
と追記して、Ctrl+o, Enter, Ctrl+x で保存して閉じます。
意味としては、先ほど実行したバックグラウンドジョブ用のコマンドを、5分ごとに実行する、となります。個人用サーバーで5分ごとはちょっと多くない? と思う場合は、 */5 の数字を、10, 20, 30… などのように増やしてみてください。
何分か待って、基本情報の画面を更新して、「最終ジョブ実行:」が更新され、5分ごとに実行されていれば成功です。
続いて、メールサーバーの設定も、必要であれば行います。
設定内容は、通常のメールソフトと同様なので、ここでは割愛します。プロバイダやレンタルサーバー、あるいはgmail, outlook などから提供されている、SMTP情報を入力してください。
一般ユーザーの追加
個人で使う分には、管理ユーザーのみで運用しても問題ないと思います。しかし、会社のイントラネットで構築したり、もちろんWebに向けて公開したりするのであれば一般ユーザーの追加が必須になります。
ユーザーメニューには、Web GUIの右上にあるユーザーアイコンのメニューからアクセスします。
ユーザー管理画面は、日本語化されているので特別難しいことはないと思います。
会社のイントラネットなどで構築する場合は、先に部署などでグループを作成しておき、ユーザーを含めるといいでしょう。面倒だからといって、部署ごとにアカウントを作成したりすると、退職者が出た際に重大なセキュリティリスクが生じますので、やめましょう。
その他、聞き慣れない言葉に「クォータ」というものがありますが、これはユーザーごとの容量の上限です。個人であればもちろん無制限でいいですが、会社で厳密に使いたい場合は、上限を設定するといいと思います。
アプリの追加
アプリの管理・追加も、右上のユーザーアイコンのメニューから行えます。ssh でコマンドラインを叩かなくても大丈夫です。楽でいいですね!
基本的に、使いたいアプリを 探して、「ダウンロードして有効にする」ボタンをクリックするだけでインストールが完了します。以下が楽介がいいなと思ったアプリを紹介します。
Transfer – ダウンロードを代わりに行ってくれるアプリ
出先で資料を集めていて、ダウンロードしたいな……とか、インストーラーを保存しておきたいな……というときに、テザリングやモバイルwi-fiでは速度が出なかったり、そもそも通信量を食い過ぎて困る……。そもそも、楽介がNextcloud を導入したのは、SSDへの書き込み回数を抑えるためでもあります。
そんな、色々ケチりたいときに便利なのがこの Transfer です(アプリでは「ファイル」カテゴリーから見つけられます)。
有効化したら、Web GUIの「+」ボタンの中に、「Transfer file from URL」という項目が追加されます。
これをクリックすると、
上図のようなプロンプトが出ます。必須項目は「Download link」 のところだけで、ここにURLをコピペし、転送ボタンをクリックします。
すると、ダウンロードが予約されます。実行されるのはバックグラウンドジョブとして、だそうなので、cronを設定していたら5分ごとに実行されることになります。
File name や Extension は、それぞれファイル名・拡張子を変更したいときに入れるといいでしょう。
Hashについては、ダウンロードファイルの正当性をチェックするときに使います。改ざんなどが問題になるときなどに使います(とはいえ、IT系の人しか使っていないような……)。
Extract – サーバー側で解凍してくれるアプリ
同じく、「ファイル」カテゴリから見つかります。有効にすると、対応した圧縮ファイルをWeb GUIで右クリックした際に「ここに展開する」というメニューが表示されます。
Transfer と組み合わせると大きめの zip から目的のファイルだけ取り出して活用できたりするので、モバイル環境に優しいアプリです。
永続しているかチェック
基本的には、公式のdocker-compose.ymlをベースにしていれば、再起動してもデータは保持され、OSが再起動した場合でも自動でDocker が起動します。
が、念のためにチェックを行います。
sudo reboot
コマンドで、OSごと再起動を行います。再起動を待ってから Nextcloud のGUIにアクセスし、設定・インストールしたアプリ、ファイルなどが残っていれば問題ありません。
WebDAV でマウント
Nextcloud は標準でWebDAVによるファイル共有が有効になっています。これを、ネットワークドライブとしてマウントすれば、通常のフォルダと同様に扱えます。
ただし、最近のWindows では WebDAVによるネットワークドライブのマウントはhttpsが必須となっています。ので、ここでは扱いません。
Nextcloud 標準のデスクトップクライアント
公式サイトにアクセスし、「DOWNLOAD FOR DESKTOP」をクリックし、隠れているダウンロードリンクを表示します。自分のOSに合わせたバージョンをダウンロードします。
インストールは、基本的にNextをクリックしていくだけで完了します(広告ソフトなどは入っていないようです)。
今回は既に自分のサーバーを構築しているので、「Log in」を選択します。
サーバーアドレスを聞かれるので、自分のサーバーのアドレスを入力します。Raspberry Pi 上にDockerで構築している場合、大体上のような感じになると思います。
次に進むと、ブラウザが自動で起動します。
セキュリティ警告が出ていますが、今は自分でDesktop Client を設定しようとしているので問題ありません。ログインをクリックします。
すでにWeb GUIにログイン済みであれば、上記のように「アクセスを許可」ボタンが表示されるので、クリックします。管理アカウントと分けたい場合は、一旦止めて、別ユーザーを作成・ログインしなおしてください。
この画面が表示されたら、ブラウザのタブを閉じて、クライアントソフトに戻ります。
同期に使用するフォルダーの選択と、同期の方式を選択します。
標準では、ユーザーフォルダの下にNextcloudフォルダが作られますが、これが嫌な場合は「Choose different folder」ボタンから、違うフォルダを選択します。
「コンテンツをすぐにダウンロードする代わりに仮想ファイルを使用する」の方式だと、OneDriveやDropBoxのように、全ファイルがローカルにダウンロードされるのではなく、ファイルを開こうとしたタイミングで初めてダウンロードされます。
オフライン状態での作業が多ければ、ファイルを全て「常にローカルに保持」し、オンラインに復帰したタイミングで同期を行う方式が適していますが、現在ではそのような運用はあまりないと思います。
フォルダと同期方式の設定が完了したら、最初の同期が行われて使用準備が整います。
エクスプローラーからフォルダの情報を見ると、サーバー上の「サイズ」と、ディスク上のサイズが異なることが分かります。これが仮想ファイルの効果ですね。
出先では、Transfer アプリでダウンロード指示を出しておいて、自宅や会社に戻ってからアプリケーションのインストールをしたり、大きなファイルを確認したり……といったことができます。
次は?
最大の課題は、このNextcloud サーバーには、外部からアクセスできません。会社のオンプレミスサーバーとしては、むしろこの方がセキュリティ上望ましい場合もありますが、自分のノートPCのバックアップ用途としては使い物になりません。
NAT(ルーター)のポートフォワードを使えば、簡単に外部からのアクセスを確保はできますが、現状ではhttpsを使っておらず、ログイン情報含めて暗号化されていないので危険です。例えば、つい公衆wi-fiからアクセスしてしまった場合などは、非常に危険です。
次はこれをなんとかしたいと思います。
次回
そんなわけで VPN を構築し、そこからアクセスします。
終わりに
Docker を使うし、簡単に入れられるだろうと思いましたが、cronをdocker用に直さないと行けなかったり、WebDAVがつながらなかったり、結構大変でした。
一方で、WebDAVでネットワークドライブのマウントができなかったお陰で、Nextcloud もオンデマンドな、仮想ファイルに対応しているということが分かってよかったです。公式サイトが英語だからちゃんと読めていないというのと、そもそもこの仮想ファイルで必要に応じてダウンロードする……という方式の正式な名称がよく分かっていない(普及していない?)というような楽介側の問題もあると思うのですが……、Nextcloud ももっとこの方式に対応しているということを前面に打ち出していいと思うんですよね。
ということで、大事なことなので何度も言いますが、Nextcloud は 仮想ファイル方式による同期に対応しています。
楽介でした。