Docker 部署个人网盘
EMTime

可道云官网:https://kodcloud.com
小兔互联官网:https://moebun.com/aff/INILUDUF

平时写博客的时候,我经常会遇到一个小麻烦:
有时候想给大家分享一些工具、项目资源或者其它一些文件,但这些文件要么太大不方便放在仓库里,要么托管在网盘上又容易过期或者限速。久而久之,我就萌生了一个想法——干脆自己搭一个网盘吧!

不过我又不想再去折腾复杂的文件系统,于是想到用对象存储来做底层存储,既省心又稳定;再配合一个界面好看、功能齐全的文件管理面板,比如可道云(KodCloud),就能轻松实现上传、预览、分享等功能。

这篇文章就来记录一下我用 Docker 部署可道云 + 对象存储的全过程,让博客文件分享这件小事变得优雅又高效。

为什么选择可道云 + 对象存储的组合

其实在写这个文章之前,或者说有了文件分享的需求之后,我其实已经尝试过很多种方案了,比如:

  • 国内的网盘:百度网盘、阿里云盘、腾讯微云等,这些网盘都非常省心,但是缺点也很明显,就是限速、限流量、限空间,以及可能会对部分文件进行审查,导致文件时不时就会失效。此外,网盘并不统一,可能你用的网盘是百度网盘,但是别人用的网盘是阿里云盘,这就导致了分享文件的时候,需要将文件上传到多个网盘,然后再下载下来,非常麻烦。
  • 自建网盘:比如 Nextcloud、Owncloud 以及可道云等,这些网盘都是开源的,可以自己搭建,自由度比较高,并且服务掌握在自己手里,非常灵活,但是缺点也很明显,就是文件存储于本地,如果服务器挂了,那么文件也就丢失了。此外,直接这样分享的话,文件传输速度也会受到服务器带宽的限制(我的小水管只有不到 100 Mbps),如果多个人同时下载,那么速度就会非常慢,严重影响用户体验。

所以,我最终选择了可道云 + 对象存储的组合,既省心又稳定。

  • 可道云可以像网盘一样进行文件的共享,其他人可以通过分享链接进行文件的下载,不用在意自己用的什么网盘,只要有安装浏览器,就可以直接下载。
  • 对象存储通过分布式存储,保证了文件的安全与稳定性,即使服务器挂了,文件也不会丢失,而且文件传输速度也不会受到服务器带宽的限制,可以支持高并发的下载,因为文件存储于对象存储中,文件传输速度是由对象存储的带宽决定的,而不是服务器带宽决定的(一般来说,对象存储的带宽都比较高)。

在本文中,将会使用小兔互联的对象存储CloudFlare R2 存储为例子进行说明。

  • 小兔互联的对象存储是收费的(价格还是比较实惠的),其上游是雨云,服务器位于国内,无论是访问速度还是稳定性都很高,并且默认只会使用你所选择的套餐内的流量,不开启弹性计费的情况下,即使流量被刷干了,也不会产生额外费用,只是会暂停服务,到下个月刷新(不过一般也不会有人去刷流量吧)。
  • CloudFlare R2 存储是免费的,每个月拥有 10G 的空间(一个月每天占用的最大空间之和的平均数 < 10G 就是免费的,超出会收取额外费用),也有上传和下载的次数限制,其速度在国内也是不错的,这些限制对于个人使用来说,基本上是够用的。

部署可道云

官方文档:https://docs.kodcloud.com/setup/docker

我们按照官方文档的说明,进行以下的操作:

  • 创建目录,作为可道云容器的映射目录,用于映射可道云的配置文件、数据文件、日志文件以及数据库等。
1
2
# 注意,这里是我自己服务器对应的目录,大家可以根据自己的需求进行修改
mkdir -p ~/doc/docker/kodcloud
  • 创建数据库环境变量配置文件 db.env,用于配置可道云的数据库信息,其中内容如下:
1
2
3
MYSQL_PASSWORD=0YXl7Q^kBGFO*&g8p96^
MYSQL_DATABASE=kodbox
MYSQL_USER=kodbox

MYSQL_PASSWORD 是数据库密码,我生成了一个随机密码,大家可以根据自己的需求进行修改。

  • 创建 compose.yml 文件,用于配置可道云的容器信息,其中内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
services:
db:
image: mariadb:lts
command: --transaction-isolation=READ-COMMITTED
restart: always
volumes:
- "./db:/var/lib/mysql" #./db是数据库持久化目录,可以修改
# - "./etc/mysql/conf.d:/etc/mysql/conf.d" #增加自定义mysql配置
environment:
- MYSQL_ROOT_PASSWORD=0YXl7Q^kBGFO*&g8p96^ # 和上面的MYSQL_PASSWORD保持一致
- MARIADB_AUTO_UPGRADE=1
- MARIADB_DISABLE_UPGRADE_BACKUP=1
env_file:
- db.env

app:
image: kodcloud/kodbox
restart: always
ports:
- 80:80 #左边80是映射到宿主机的端口,可以修改并且建议修改,因为80端口可能被其它服务占用
volumes:
- "./site:/var/www/html" #./site是站点目录位置,可以修改
environment:
- MYSQL_HOST=db
- REDIS_HOST=redis
env_file:
- db.env
depends_on:
- db
- redis

redis:
image: redis:alpine
restart: always
  • MYSQL_ROOT_PASSWORD 和上面的数据库密码保持一致。
  • ports 中的 80 端口可以根据自己的需求进行修改,因为 80 端口可能被其它服务占用,这时候因为端口为非标准的 http 端口,所以需要配置 nginx 或其它反向代理服务器,才能正常访问。

配置完成,使用以下命令启动可道云:

1
docker compose up -d

Caddy 配置反向代理

我使用的是 caddy 进行了反向代理,具体可以参考我的另一篇文章:Caddy反向代理
在这里,我们只需要在 Caddyfile 中增加以下配置即可:

1
2
3
4
你的域名或者端口 {
tls 证书.crt 证书.key
reverse_proxy 127.0.0.1:21773
}
  • “你的域名或者端口”需要替换成你自己的域名或者端口。
  • 21773 是上面 compose.yml 文件中 app 服务的端口,也就是刚刚强调过的可以修改的 80 端口,我的compose.yml 文件中已经修改成了 21773。

配置完之后,重启 caddy 即可生效,使用配置的域名或者端口即可正常访问可道云。

进入可道云并配置对象存储

使用配置的域名或者端口访问可道云,进入可道云后,首先需要配置管理员账号和密码,这一部分就不用我过多赘述了,你自己配置好管理员账号和密码后,登录即可。

进入可道云后,首先需要配置对象存储,因为可道云默认使用的是本地存储,我们需要将其修改为对象存储,才能实现文件的存储和分享。

小兔互联对象存储配置

  1. 获取访问凭证信息

进入小兔互联的对象存储控制台,选择我们购买的对象存储实例,点击管理即可看到相关信息,如下:

  1. 创建存储桶并添加网络挂载

我们点击创建存储桶,自己取一个名字(只能是字母数字和 ‘-’,不能是其它字符),比如我取的是 emtime,所属实例选择我们购买的实例,点击创建即可创建好我们对应的存储桶。

回到可道云,我们点击左侧的文件管理,然后点击网络挂载,点击新增网络挂载,存储类型选择 MinIO

  • 名称:自定义,比如我这里填写的是小兔互联。
  • 空间大小:根据购买的套餐填写,比如我这里填写的是 10,表示 10GB。
  • Access Key ID:对应访问凭证信息图片中 Access Key。
  • Access Key Secret:对应访问凭证信息图片中 Secret Key。
  • Bucket 名称:就是我们自己创建的存储桶名称,比如我这里填写的是 emtime。
  • 地域节点:对应访问凭证信息图片中的 API 端点。
  • 存储区域:无需填写。
  • 存储目录:默认即可。
  • 允许文件缩略图:按自己的需求选择,我这里没有开启。
  • 服务器中转:如果开启,文件传输会先经过可道云服务器,然后通过服务器再传输到对象存储,一般会占用服务器带宽。除非网络不通或直连不稳定,否则建议关闭,让客户端直接访问对象存储效率会更高。
  • 设为默认:按自己的需求选择,我这里将小兔存储设置为了默认存储。

这样我们的对象存储就配置好了,接下来我们就可以上传文件了,上传的文件会自动存储到我们配置的对象存储中。

CloudFlare R2 配置

说来 CloudFlare 也算是“赛博善人”了,免费功能非常多:CDN 加速、虚拟组网、内网穿透(Cloudflare Tunnel),甚至还有 SSL 证书自动签发与续期。对个人开发者或小项目来说,这些工具几乎能解决大部分对外访问和安全的烦恼,省钱又省心。不过比较可惜的是,在国内用的话体验没那么理想,偶尔会遇到访问慢或者节点不太稳定的情况。

  1. 订阅 R2 存储并添加存储桶

如图所示,我们在对应菜单中点击 R2 对象存储,然后在界面的右上角点击创建存储桶,根据图片进行设置即可。

  1. 获取 API

CloudFlare 的对象存储提供了兼容 S3 的 API,而可道云也支持 S3,所以我们直接创建 S3 API 即可。按照我图片中的步骤进行操作即可。

最后这个图片是我们创建的 API 的信息,将图片中的信息最好全都复制出来,后面配置可道云的时候需要用到。

  1. 可道云添加网络挂载

和前面差不多,回到可道云,我们点击左侧的文件管理,然后点击网络挂载,点击新增网络挂载,存储类型选择 S3 存储

  • 名称:自定义,比如我这里填写的是 Cloudflare R2。
  • 空间大小:CloudFlare R2 对象存储,免费版本也是 10GB,所以这里填写 10。
  • Access Key ID:对应 API 信息中的访问密钥 ID。
  • Access Key Secret:对应 API 信息中的机密访问密钥。
  • Bucket 名称:创建存储桶时填写的名称。
  • 地域节点:对应 API 信息中的为 S3 客户端使用管辖权地特定的终结点。
  • 存储区域:无需填写。
  • 存储目录:默认即可。
  • 签名版本:默认 V4 即可。
  • 允许文件缩略图:按自己的需求选择,我这里没有开启。
  • 服务器中转:和之前一样,除非网络不通或直连不稳定,否则建议关闭,让客户端直接访问对象存储效率会更高。
  • 设为默认:按自己的需求选择,因为我设置了小兔互联的对象存储为默认存储,所以这里就不勾选了。

这样我们的 CloudFlare R2 对象存储就配置好了,接下来我们就可以上传文件了,上传的文件会自动存储到我们配置的对象存储中。

测试使用

配置完成后,我们就可以像使用普通网盘一样上传、下载和分享文件了。
上传一个文件后,直接生成分享链接,其他人点击即可下载,整个传输过程都会通过对象存储完成,不再占用你服务器的带宽。

我分别测试了小兔互联和 Cloudflare R2 两个对象存储的下载速度(本地带宽为 1000 Mbps):

小兔互联:

可以看到,小兔互联的下载速度还是很快的,而且完全不占用服务器流量,体验非常好

CloudFlare R2:

Cloudflare R2 的速度也很不错,只是由于节点主要在国外,在国内的访问速度和稳定性稍差一些。
不过对于个人使用来说,它依然是一个非常有性价比(甚至可以说“白嫖友好”)的方案。

总结

整体来说,这套 “可道云 + 对象存储” 的组合,既能拥有类似网盘的便捷体验,又不必担心限速等问题

如果你手上也有一台闲置的服务器,不妨试试这套方案。
搭建过程不复杂,但带来的便利却很明显——让博客文件分享更轻、更快,也更优雅。

 Comments
Comment plugin failed to load
Loading comment plugin
💡 请正确填写您的邮箱,以确保能接收到来自本博客的评论回复通知~(*^▽^*)