自己配置一个Nextcloud作为私人云服务用着放心,而且现在自己安装Nextcloud非常方便。为了方便在外面的时候查看个人备份的数据,可以将备份文件夹设置为Nextcloud的外接存储 (External Storage)。前些天整理服务器的时候不小心把以前配置的通过 SFTP 外接的存储空间的证书删除了。重新配置,又发现新版本的 Nextcloud 25.0 中管理页面里面的 SFTP 配置有问题,无法自动生成密钥对。下面是使用 occ 来配置的方法。
官方也有使用 occ 来配置 External storage 的说明。不过一般情况下还真想不到有这个方法。我也是无意中看到的。
背景¶
下面假设服务器上 Nextcloud 安装在 /srv/www/htdocs/nextcloud 目录下,运行 PHP/Apache 的 Linux 用户为 wwwrun。
切换到 Nextcloud 安装目录,
$ cd /srv/www/htdocs/nextcloud
为了方便使用wwwrun用户来运行指令,我们先切换为 root 用户,
$ su
导出当前的外部存储配置情况¶
指令 occ files_external:export 可导出当前配置的外部存储,json 格式的配置文件内容,
# sudo -u wwwrun php occ files_external:export
[
{
"mount_id": 1,
"mount_point": "\/HomeGallery",
"storage": "\\OC\\Files\\Storage\\Local",
"authentication_type": "null::null",
"configuration": {
"datadir": "\/data\/HomeGallery\/"
},
"options": {
"encrypt": true,
"previews": true,
"enable_sharing": false,
"filesystem_check_changes": 1,
"encoding_compatibility": false,
"readonly": false
},
"applicable_users": [
"${nc_user}"
],
"applicable_groups": []
},
{
"mount_id": 2,
"mount_point": "\/PC_Backup",
"storage": "\\OCA\\Files_External\\Lib\\Storage\\SFTP",
"authentication_type": "publickey::rsa_private",
"configuration": {
"host": "192.168.1.1:2222",
"root": "\/data\/_backup\/PC_Backup\/",
"user": "${ssh_user}",
"public_key": "${public_key}",
"private_key": "${private_key}",
"password": ""
},
"options": {
"encrypt": true,
"previews": true,
"enable_sharing": false,
"filesystem_check_changes": 1,
"encoding_compatibility": false,
"readonly": true
},
"applicable_users": [
"${nc_user}"
],
"applicable_groups": []
}
]
上面输出的结果中有两个外部存储。mount_id 为 1 的是一个没使用认证("null::null")的外部存储。与Nextcloud运行在同一个系统中,可直接访问指定目录 /data/HomeGallery/ 中的文件。可在Nextcloud中挂载该外部存储的Nextcloud用户的用户名被我打码替换成了 ${nc_user}。(其实没必要 :))可以看到路径中的 /都被加了个 \ 来转义了。
mount_id 为 2 的就是使用 RSA Public key 认证(publickey::rsa_private)的 SFTP 连接的那个外部存储了。可以用这个作为模板来编写一个配置文件,假设为 ext_config.json 文件,然后将其导入Nextcloud就完成配置了。
准备要导入的配置的 json 文件¶
准备配置文件的时候,那些路径就不需要前置转义符号反斜杠 \ 了。例如,
{
"mount_id": 1,
"mount_point": "/NEW_EXT_STORAGE",
"storage": "\\OCA\\Files_External\\Lib\\Storage\\SFTP",
"authentication_type": "publickey::rsa_private",
"configuration": {
"host": "192.168.1.1:2222",
"root": "/TARGET/DIRECTORY/",
"user": "${SSH_user}",
"public_key": "${public_key}",
"private_key": "${private_key}",
"password": ""
},
"options": {
"encrypt": true,
"previews": true,
"enable_sharing": false,
"filesystem_check_changes": 1,
"encoding_compatibility": false,
"readonly": true
},
"applicable_users": [
"${nc_user}"
],
"applicable_groups": []
}
其中标蓝色的部分是需要注意修改的。
RSA Public key 认证配置部分需要多加注意,说明如下。 ${public_key} 和 ${private_key} 可以就地生成,现在 4096bit 的安全性应该是基本的吧。
假设我们现在登录到要连接到的那个服务器的那个文件夹("/TARGET/DIRECTORY/")的所有者帐户(或者有访问权的其他某个帐户),进入其家目录的 .ssh 文件夹,
$ cd /home/sftp_user/.ssh
创建一个 4096 位的 RSA 密钥对,
$ ssh-keygen -trsa -b4096
假设将其产生的公钥和私钥保存为 id_rsa_nc_sftp.pub 和 id_rsa_nc_sftp 了。
将公钥加入该sftp用户的可信公钥列表,
$ cat id_rsa_nc_sftp.pub >> /home/sftp_user/.ssh/authorized_keys
公钥提取,
$ cat id_rsa_nc_sftp.pub
私钥提取,
$ cat id_rsa_nc_sftp | sed '/OPENSSH/d' | tr -d '\n'
这里需要去掉私钥文档中的头和尾,并且要去掉换行符。
用这两个提取的公钥和私钥替换掉配置文件中的 ${public_key} 和 ${private_key}。
导入配置¶
导入配置非常简单,
# sudo -u wwwrun php occ files_external:import /path/to/new/ext_config.json
现在就可以到 Nextcloud 的管理面板中看看新加入的外部存储了。一些属性,比如上面的配置设定挂载为“只读”了,还可以修改。©
本文发表于水景一页。永久链接:<https://cnzhx.net/blog/setup-nextcloud-external-storage/>。转载请保留此信息及相应链接。