前言
博客网站是通过宝塔部署在云服务器上的,防止云服务器出现问题导致数据丢失,就想着将数据库备份文件保存一份到家里的 NAS 上。 NAS 本身有 FTP 服务器,但因为端口问题连不上。最终解决方案是在 NAS 上运行一个 HTTP 文件服务,通过上传的方式保存。如果有相似需求的可以参考一下。
前置条件:
- 家里的网能获取公网 IP
- 有一个自己域名
1. 让域名能解析到家里宽带的公网IP
我使用的是 ddns-go,一个能自动获取公网 IP,并设置域名解析的服务,支持的域名服务商 Alidns(阿里云)
Dnspod(腾讯云)
Cloudflare
华为云
Callback
百度云
Porkbun
GoDaddy
Google Domain
,支持 Mac、Windows、Linux 系统,支持 ARM、x86架构。
我是在 NAS 上部署了 docker arm 版本,简单配置之后,就能用域名解析到公网 IP 了。
GitHub - jeessy2/ddns-goDocker - jeessy/ddns-go
2. NAS 上运行 HTTP 文件服务
文件服务使用的是 filebrowser,一个用 go 实现的简单文件管理服务,能上传下载,支持多用户。
GitHub - filebrowser/filebrowser: 📂 Web File BrowserDocker - filebrowser/filebrowser
符合我上传文件的需求,而且运行所需资源不多。部署后,新增一个专门用来上传账号,限制账号只有上传权限(这里有坑,因为上传分 2 步,所以要包含 编辑
权限,否则会上传不了)。
在路由器、光猫上设置好端口开放,就可以通过域名+端口从外网上传文件到NAS了。
3. 通过 shell 脚本定时上传指定目录下的文件
通过调试页面的上传接口,完成使用 curl
命令上传文件的 shell 脚本。 可以使用 crontab 定时执行,有宝塔面板的话,用计划任务更方便。
以下是脚本,修改目录、域名、登录账号密码,就可以了。
#!/bin/sh
# 目标目录
path="/www/backup/database"
# 上传后的目录
remotePath="test/"
# 域名
url="http://xxxx.xxx:8080"
# 登录
token=`curl -XPOST -H "Content-Type: application/json" ${url}/api/login -d '{"username":"upload","password":"pass","recaptcha":""}'`
#echo $token
# 上传
list=`ls $path`
for file in $list
do
echo "upload file: $file"
uploadUrl=${url}/api/tus/${remotePath}${file}?override=true
#echo $uploadUrl
# 创建文件
curl -X POST -H "X-Auth: ${token}" $uploadUrl --data-binary "@${path}/${file}"
# 上传文件
curl -X PATCH -H "X-Auth: ${token}" -H "Content-Type: application/offset+octet-stream" -H "Upload-Offset: 0" --data-binary "@${path}/${file}" $uploadUrl
done