Duplicati使用阿里云对象存储OSS

134

前言

目前duplicati已经合并了@Jojo-1000的代码,但项目的release还没有更新.
所以使用docker镜像的用户还不能自动更新,因为docker镜像由linuxserver自动获取项目的release来构建的

原因

Duplicati是一款免费的开源备份客户端,它提供了安全的备份解决方案,可以加密、增量备份和压缩数据,并存储在云存储服务和远程文件服务器中。

我一直使用Duplicati来加密备份我的Unraid系统数据、Docker数据和虚拟机数据到本地磁盘。然而,为了进一步提升数据的安全性,我希望能够将备份文件存储到对象存储中。不过,Duplicati对阿里云对象存储(OSS)的S3兼容性并不理想,存在一些限制和问题。

为了解决问题,我在社区发帖并得到了问题原因的指引。我纠正了该问题,并提供了以下具体操作步骤:

1. 修改出问题的代码

如社区用户@Jojo-1000所说Maybe just setting UseChunkEncoding to false will work.根据他的提示,在https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Backend/S3/S3AwsClient.cs#L137添加一行代码
https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Backend/S3/S3AwsClient.cs#L137

2. 生成新的文件

两种方式,1.自己更改代码构建2.用我的

2.1 自己fork后更改代码

安装visual studio时需要勾选.net Framework4.7的SDK
1
点击视图->解决方案资源管理器切换到文件夹视图
定位到文件:Duplicati/Library/Backend/S3/S3AwsClient.cs的136行,添加一行代码:

public virtual async Task AddFileStreamAsync(string bucketName, string keyName, System.IO.Stream source,
            CancellationToken cancelToken)
        {
            var objectAddRequest = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = keyName,
                InputStream = source,
// Add this:
                UseChunkEncoding = false
// ------------
            };
            if (!string.IsNullOrWhiteSpace(m_storageClass))

2
更改代码后双击Duplicati.sln文件,选择生成->生成解决方案

然后在你的仓库路径\Duplicati\Server\bin\Debug中找到Duplicati.Library.Backend.S3.dll这个文件,复制出来备用

2.2 用我提供的文件

这里下载文件

3. 替换旧文件

数据有风险,操作需谨慎,建议新建一个容器测试
我使用的是unraid中的docker,使用安装包安装的方式应该能直接替换,下面是替换docker中的方法:

3.1 上传文件到服务器

自己用ftp/WindTerm/MobaXterm上传,这里假定上传的路径是 /tmp/duplicati/file/

3.2 新建一个duplicati的容器!

用自己的方式新建一个备用的容器,并确保能启动,注意端口号不要和已有的duplicati冲突


使用unraid的注意/source/appdata的文件夹映射,默认情况会和你的主duplicati一致

使用命令进入容器,查看没有替换前的文件信息

root@Tower:/# docker exec -it 9d0 /bin/bash
root@9d0ebc79cf44:/# cd app/duplicati/
root@9d0ebc79cf44:/app/duplicati# ls -l | grep Duplicati.Library.Backend.S3
-rw-r--r-- 1 root root    69272 May 26 01:59 Duplicati.Library.Backend.S3.dll
-rw-r--r-- 1 root root      177 May 26 01:59 Duplicati.Library.Backend.S3.dll.config

注意下这两个文件的创建时间May 26 01:59是5月26
使用docker cp替换文件到容器内:

docker cp ./Duplicati.Library.Backend.S3.dll 9d0:/app/duplicati

重新进入容器,查看文件的时间

root@9d0ebc79cf44:/app/duplicati# ls -l | grep Duplicati.Library.Backend.S3
-rw-r--r-- 1 root root    54784 Jul 22 21:53 Duplicati.Library.Backend.S3.dll
-rw-r--r-- 1 root root      177 May 26 01:59 Duplicati.Library.Backend.S3.dll.config

时间变了说明成功替换,执行命令 docker restart 9d0 重启容器

4. 添加阿里云OSS

其他设置自行处理,重要的设置如图所示


文件夹路径(Folder path)不要输入斜杠/
登录阿里云,能看到备份的文件就是正常的了