Snap版NextCloudのインストール
apacheやphp、mysqlなどから成るNextCloudも、Snapでのインストールなら簡単です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ snap list Name Version Rev Tracking Publisher Notes core20 20221123 1738 latest/stable canonical✓ base lxd 5.0.1-9dcf35b 23541 5.0/stable/… canonical✓ - snapd 2.57.6 17883 latest/stable canonical✓ snapd $ sudo snap install nextcloud nextcloud 24.0.7snap1 from Nextcloud✓ installed $ snap list Name Version Rev Tracking Publisher Notes core18 20221103 2632 latest/stable canonical✓ base core20 20221123 1738 latest/stable canonical✓ base lxd 5.0.1-9dcf35b 23541 5.0/stable/… canonical✓ - nextcloud 24.0.7snap1 32537 latest/stable nextcloud✓ - snapd 2.57.6 17883 latest/stable canonical✓ snapd $ snap changes nextcloud ID Status Spawn Ready Summary 5 Done today at 04:04 UTC today at 04:05 UTC Install "nextcloud" snap |
インストール後、実際には次のコマンドで管理者アカウントを作成することによって、NextCloudが構築されます(実行後、プロンプトが戻ってくるまで少し時間が掛かります)。
1 2 3 |
$ sudo nextcloud.manual-install #ADMINUSERNAME# #PASSWORD# Waiting for PHP... done Nextcloud was successfully installed |
デフォルトでは localhost からのアクセスしか信頼していないので、LAN上のリモートホストからブラウザでアクセスしようとするとこのように。
となってしまうので、信頼できるドメインのリストにLAN IPアドレスを追加します。
1 2 3 4 5 6 7 8 |
$ sudo nextcloud.occ config:system:get trusted_domains localhost $ sudo nextcloud.occ config:system:set trusted_domains 1 --value=192.168.2.45 System config value trusted_domains => 1 set to string 192.168.2.45 $ sudo nextcloud.occ config:system:get trusted_domains localhost 192.168.2.45 |
再びブラウザからLAN IPへアクセスすると、今度は正常にログインページが表示されました。
NextCloudの初期設定
Snap版NextCloudに付与されているリソースを確認してみると、デフォルトでは下の2項目が有効になっていません。
1 2 3 4 5 6 |
$ snap connections nextcloud Interface Plug Slot Notes network nextcloud:network :network - network-bind nextcloud:network-bind :network-bind - network-observe nextcloud:network-observe - - removable-media nextcloud:removable-media - - |
network-observe を有効にすると、NextCloud管理者画面の /index.php/settings/admin/serverinfo にネットワーク情報が表示されるようになります。
また removable-media を有効にしないとNextCloudが /media 以下を扱えないので、データディレクトリを変更する前に忘れずに有効にしておきます。
1 2 3 4 5 6 7 8 |
$ sudo snap connect nextcloud:network-observe $ sudo snap connect nextcloud:removable-media $ snap connections nextcloud Interface Plug Slot Notes network nextcloud:network :network - network-bind nextcloud:network-bind :network-bind - network-observe nextcloud:network-observe :network-observe manual removable-media nextcloud:removable-media :removable-media manual |
Let’s Encryptの導入
予めルータに http と https のNATを通しておいた上で、ターミナルからLet’s Encryptをセットアップします。
ドメインはNo-IPで取得したホスト名にルータのWAN IPを引き当ててあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ sudo nextcloud.occ config:system:set trusted_domains 2 --value=MYDOMAIN.EXAMPLE.COM System config value trusted_domains => 2 set to string MYDOMAIN.EXAMPLE.COM $ sudo nextcloud.occ config:system:get trusted_domains localhost 192.168.2.45 MYDOMAIN.EXAMPLE.COM $ sudo nextcloud.enable-https lets-encrypt In order for Let's Encrypt to verify that you actually own the domain(s) for which you're requesting a certificate, there are a number of requirements of which you need to be aware: 1. In order to register with the Let's Encrypt ACME server, you must agree to the currently-in-effect Subscriber Agreement located here: https://letsencrypt.org/repository/ By continuing to use this tool you agree to these terms. Please cancel now if otherwise. 2. You must have the domain name(s) for which you want certificates pointing at the external IP address of this machine. 3. Both ports 80 and 443 on the external IP address of this machine must point to this machine (e.g. port forwarding might need to be setup on your router). Have you met these requirements? (y/n) Y Please enter an email address (for urgent notices or key recovery): EMAIL@EXAMPLE.COM Please enter your domain name(s) (space-separated): MYDOMAIN.EXAMPLE.COM Attempting to obtain certificates... done find: Failed to restore initial working directory: /home/user: Permission denied Restarting apache... done |
最後のメッセージが気になりますが、証明書が正常にインストールされていることが、ブラウザアクセスから確認できました。
サンプルファイルの削除
NextCloudでユーザアカウントを作成すると、必ずサンプルファイルやテンプレートフォルダが生成されてしまいます。
自分一人で使うクラウドならまだしも、複数ユーザ用意するとなると削除もなかなかの手間に。
これらのひな型となるフォルダを指定し、その中身を空っぽにすれば良さそうなので実践してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo mkdir -p /var/snap/nextcloud/common/skeleton $ sudo mkdir -p /var/snap/nextcloud/common/template $ sudo nextcloud.occ config:system:set skeletondirectory --value=/var/snap/nextcloud/common/skeleton System config value skeletondirectory set to string /var/snap/nextcloud/common/skeleton $ sudo nextcloud.occ config:system:get skeletondirectory /var/snap/nextcloud/common/skeleton $ sudo nextcloud.occ config:system:set templatedirectory --value=/var/snap/nextcloud/common/template System config value templatedirectory set to string /var/snap/nextcloud/common/template $ sudo nextcloud.occ config:system:get templatedirectory /var/snap/nextcloud/common/template |
これにより、新たにユーザを作成しても、中身は最小限になりました(Templateフォルダはどうしても作成されてしまいますが、中身は空っぽです)。
データディレクトリを変更
次に上述で追加した仮想ディスクへNextCloudのデータディレクトリを移します。
一旦NextCloudを止めてから、現在のデータディレクトリである /var/snap/nextcloud/common/nextcloud/data を移動。
1 2 3 4 5 6 |
$ sudo snap stop nextcloud 2022-12-08T06:39:58Z INFO Waiting for "snap.nextcloud.mysql.service" to stop. Stopped. $ sudo mkdir /media/vol1/nextcloud $ sudo chmod 0770 /media/vol1/nextcloud $ sudo mv /var/snap/nextcloud/common/nextcloud/data /media/vol1/nextcloud/ |
そしてNextCloudの設定ファイル /var/snap/nextcloud/current/nextcloud/config/config.php を、管理者権限で直接以下の要領で変更します。
1 2 3 4 |
前) 'datadirectory' => '/var/snap/nextcloud/common/nextcloud/data', 後) 'datadirectory' => '/media/vol1/nextcloud/data', |
NextCloudを再開させ、管理者ページからディスク情報を確認。
使わないアプリの無効化
今回必要なのはごくごく基本的なファイル共有なので、デフォルトで有効になっているさまざまなアプリはことごとく無効化しました。
必要最小限に絞ったデフォルトアプリの他、新たに次の2つのアプリをインストールしました。
File Access Controlアプリでファイル制限
追加したアプリの1つ目は、様々な条件を設定してユーザが出来ることを制限することのできるFile Access Controlアプリ。
このストレージの用途はいくつかのサテライトオフィスにあるコピー複合機が受信するFAXファイルの出力先とすることで、ユーザからのワンストップアクセスを可能とするものでした。
過去の類似サービスの運用実績を鑑みつつ、実際に従ってユーザに許されるのは、サブフォルダの作成の他に以下のファイルへのアクセスです。
- PDFファイル
- 画像系ファイル
- Office系文書ファイル
- テキストファイル
これをFlowの中で以下のように定義して実現しています。
なお、条件句の is/is not と matches/does not match の違いですが、条件に正規表現が使われるような場合には match/does not match を使う必要があるようです。
なので例えば、 does not match と PDF documents を組み合わせても、期待通りには振る舞わないので気をつけましょう(ここでハマりました)。
Group Folderアプリでユーザ間共有
もう1つ追加したGroup Folders アプリは、同じグループに属する複数ユーザがグループ内で共有できるフォルダ機能です。
先ずユーザをいくつか作成し、それらを faxgroup と言うグループに束ねます。
1 2 3 4 |
faxgroup ├── faxuser1 ├── faxuser2 └── faxuser3 |
Group Foldersアプリをインストールすると、管理者設定にGroup Foldersの設定が現れるので、 fax と言うグループ内共有フォルダを設定し、 faxgroup に読み書き権限を付与します。
ユーザアカウントで入ってみると、グループ内共有がアイコンの違いで分かります。そのまま試しにサブフォルダを作成してみました。
ターミナルから実体を探してみると、 __groupfolders の中にナンバリングされたフォルダとして存在していました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/media/vol1/nextcloud/data/ ├── appdata_############ ├── faxuser1 │ ├── files │ └── files_trashbin ├── faxuser2 │ ├── files │ └── files_trashbin ├── __groupfolders │ ├── 1 ←ココ!! │ │ ├── c │ │ ├── m │ │ └── s │ ├── trash │ └── 1 ├── index.html └── ncadmin ├── files └── files_trashbin |
ゴミ箱の定期清掃
NextCloud上のファイルは削除してもゴミ箱に溜まるだけなので、放っておくといずれ容量を圧迫することになります。
自動的に削除するような仕組みは特にGUI上で用意されていないので、CLIベースで次のコマンドをcronへ登録することになります。
1 2 3 4 5 6 7 8 9 10 |
$ sudo nextcloud.occ trashbin:cleanup --all-users Remove deleted files for all users Remove deleted files for users on backend Database faxuser1 faxuser2 ncadmin $ sudo ls -l /media/vol1/nextcloud/data/__groupfolders/trash/1 -rw-r--r-- 1 root root 1 Dec 9 10:41 Readme.md.d1670554399 -rwxrwxr-x 1 root root 1 Dec 8 15:14 Readme.md.d1670554409 -rwxrwxr-x 1 root root 0 Dec 8 15:57 '新しいテキスト ドキュメント.txt.d1670486248' |
但し、このコマンドではGroup Foldersアプリの共有フォルダは取り残されてしまっているので、調べてみると別のコマンドで削除できました。
1 2 3 |
$ sudo nextcloud.occ groupfolders:trashbin:cleanup -f $ sudo ls -l /media/vol1/nextcloud/data/__groupfolders/trash/1 total 0 |
-f オプションを付与しないと、確認のプロンプトが返ってくるので、cronなどで自動実行の際は要注意。
最後にファイヤーウォール有効に
NextCloud構築作業を終えたら、ささやかながらファイヤーウォールを有効にしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ sudo ufw status Status: inactive $ sudo ufw default allow outgoing Default outgoing policy changed to 'allow' (be sure to update your rules accordingly) $ sudo ufw default deny incoming Default incoming policy changed to 'deny' (be sure to update your rules accordingly) $ sudo ufw allow 22,80,443/tcp Rules updated Rules updated (v6) $ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup $ sudo ufw status numbered Status: active To Action From -- ------ ---- [ 1] 22,80,443/tcp ALLOW IN Anywhere [ 2] 22,80,443/tcp (v6) ALLOW IN Anywhere (v6) |
LAN上の別のホストから戸締まりを確認します。
1 2 3 4 5 6 7 8 9 |
$ nmap 192.168.2.45 Starting Nmap 7.01 ( https://nmap.org ) at 2022-12-12 11:30 HKT Nmap scan report for 192.168.2.45 Host is up (0.00042s latency). Not shown: 997 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https |
次回はFUJIFIM製コピー複合機が、このストレージへ受信FAXのPDFファイルを転送できるようにする部分についてまとめます。
参考)Snap版NextCloud構築にあたっては、こちらのページを何度も参考にさせて頂きました(鳴謝!)。