七牛域名回收后的文件导出和迁移
起因
七牛回收测试域名
最近七牛在回收qbox.me
的测试子域名,然而很不幸博客图床当初注册七牛使用的是匿名邮箱,转发后全进了垃圾箱。关注到这个事情的时候域名已经回收。
更尴尬的是,如果存储空间绑定的七牛测试域名被回收,不仅无法访问资源,而且登录到七牛后台也是无法查看和下载COS中的文件。除非新绑定融合CDN域名且主域通过备案(即使只用海外CDN加速节点)。
由于短期内没有做这事的计划,所以决定将博客的静态资源和图片从七牛迁移到其他图床,不过首先得导出COS上的存量文件。
未绑定域名的七牛存储空间文件导出
创建新的存储空间
由于源空间已经没有域名了,在不绑定自定义域名的情况下是无法获取到COS的文件的。
而新创建的存储空间会带一个30天有效期的七牛测试域名(见七牛文档:测试域名使用规范)
所以可以新创建一个存储空间,将源空间下的资源复制到新空间中,借用新空间的测试域名,将资源拉取出来。
在管理后台新建一个公开的存储空间,假定创建的空间名是target-bucket
,存储区域选择和源空间相同,就能在空间概览-融合CDN测试域名
中看到测试域名了,这个域名后面批量下载时会用到。
使用qshell导出文件
七牛的qshell是利用七牛文档上公开的API实现的一个方便开发者测试和使用七牛API服务的命令行工具,文档可见:https://github.com/qiniu/qshell
添加账户鉴权信息(AK/SK)照文档说明即可,这里略去不提。
1,导出源空间下的所有文件清单
使用listbucket命令,如果文件实在太多的话也可以考虑用listbucket2
这里假定要导出的源空间名称是source-bucket
,导出的清单文件名是backup.log
1
qshell -m listbucket source-bucket backup.log
2.提取清单文件中的路径
清单文件大致是这样的格式:1
2
3
4hello.jpg 1710619 FlUqUK7zqbqm3NPwzq2q7TMZ-Ijs 14209629320769140 image/jpeg 1
hello.mp4 8495868 lns2dAHvO0qYseZFgDn3UqZlMOi- 14207312835630132 video/mp4 0
hhh 1492031 FjiRl_U0AeSsVCHXscCGObKyMy8f 14200176147531840 image/jpeg 1
jemygraw.jpg 1900176 FtmHAbztWfPEqPMv4t4vMNRYMETK 14208960018750329 application/octet-stream 1 QiniuAndroid
后续步骤只需要路径字段,可以在IDE里用正则匹配过滤一下,并将分组1整理输出来:1
^([^\s]+)\s+.+\n
因为路径字段在第一列,也可以直接使用awk
命令更为方便(这里排除了第一行表头):1
awk 'NR>1 {print $1}' backup.log > file-list.log
整理的文件路径清单保存在file-list.log
中
3.将清单中的文件拷贝到新的存储空间
使用qshell的https://github.com/qiniu/qshell/blob/master/docs/batchcopy.md命令,将清单文件从源空间拷贝到目标空间:1
qshell -m batchcopy source-bucket target-bucket file-list.log
这一步会要求输入一个验证码来确认操作,按指示说明即可。
4.批量下载文件
其实到了这一步,已经能在后台管理页面的新存储空间target-bucket
中看到文件并手动下载了
当然如果不愿意一个个手动下载的话,可以使用qdownload命令批量下载。
在下载之前需要先创建一个下载配置文件:1
2
3
4
5
6
7
8{
"cdn_domain" : "xxx.bkt.clouddn.com",//cdn域名,即新创建的存储空间分配的测试域名
"dest_dir" : "/path/to/downloadDir",//批量下载的目标目录
"bucket" : "target-bucket",//存储空间名称
"log_file" : "download.log",//下载日志输出文件
"log_level" : "info",//下载日志输出级别
"log_stdout" : true
}
注意上述配置中需要设置cdn_domain
才可以使用七牛的10G免费流量
10线程并发下载:1
qshell -m qdownload 10 qdisk_down.conf
这样就成功把存储空间下的所有文件下载到本地了
新图床选择
新图床的选择花费了一点时间,各方面了解了下以后,决定利用现有闲置资源将OneDrive改造为一个私人图床,比较成熟的解决方案是OneIndex,大致看了下实现方式:
- 通过创建Azure AD应用程序,获取OneDrive的SharePoint Online访问授权
- OneIndex应用程序通过留存的
refreshToken
,定时刷新维护accessToken
- 在网盘中维护单独的目录结构,访问资源时通过302跳转到解析的对应资源文件访问路径,且携带临时的资源访问授权信息
而且这东西也有Docker,部署起来更为方便。