为Nextcloud配置外部存储

自己配置一个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.pubid_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/>。转载请保留此信息及相应链接。

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>