如果你配置完阿里云OSS(正确填写endpoint、bucket名)后,报错:
[EFAULT] 20xx/xx/xx xx:xx:xx ERROR : : error listing: SecondLevelDomainForbidden: Please use virtual hosted style to access. status code: 403, request id: xxxxxxxxxxxxxxxxxxxxxxxx, host id: 20xx/xx/xx xx:xx:xx Failed to lsjson with 2 errors: last error was: error in ListJSON: SecondLevelDomainForbidden: Please use virtual hosted style to access. status code: 403, request id: xxxxxxxxxxxxxxxxxxxxxxxx, host id:
不要自我怀疑,你大概率没有配置错误,这就是TrueNAS与OSS对接的锅,本文将会解决这个问题。
TrueNAS的云同步WebUI并没有Alibaba Cloud的选项。虽说有S3的选项,而且阿里云OSS的API支持S3风格接口访问,但是两者支持程度并不好,具体表现为凭据验证通过,bucket list可以展示,但是Object list报错。
报错提示应该是没有通过虚拟主机style访问,可能是通过路径style访问的。试过将域名直接写入endpoint的输入框里作为前缀,仍然无效。
偶然读到了https://reficul.io/2023/07/18/backup-truenas-to-oss/这篇帖子,按照方案试了下,发现TrueNAS 25已经修改了python package的路径(/usr/lib/python3/dist-packages/),而且整个路径都是read-only的
不过发现/usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py这个文件仍然是存在的,因此我们可以在其它卷建立一个文件的副本,并加入OSS的支持,最后再通过mount --bind覆盖原文件。
mkdir -p /var/db/system/custom_scripts
cp /usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py /var/db/system/custom_scripts/cloud_sync_fixed.py
vim /var/db/system/custom_scripts/cloud_sync_fixed.py

在相应的位置,添加阿里云oss的支持代码:
if "aliyuncs.com" in config.get("endpoint", ""):
logger.warning(f"set provider for {config['endpoint']} as Alibaba")
config["provider"] = "Alibaba"
保存后我们覆盖掉python package里面的文件,并重启middleware
mount --bind /var/db/system/custom_scripts/cloud_sync_fixed.py /usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py
systemctl restart middlewared
重新进入TrueNAS的云同步配置页面,发现OSS list file已经不报错了

最后我们将补丁生效脚本添加到开机启动项(WebUI-系统-服务)里面,即可使得开机自动生效
mount --bind /var/db/system/custom_scripts/cloud_sync_fixed.py /usr/lib/python3/dist-packages/middlewared/plugins/cloud_sync.py && systemctl restart middlewared
