背景
日常生活中难免要发送一些文件,但现在网盘基本都要开会员,不然下载会限速;通过wx发送文件很快,但是一些特殊的文件,如apk文件的话,会被改为apk.1 ,所以就自己在服务器上搭个文件服务器,方便文件传输
对比
问一下chatGPT,确定选择Dufs来搭建
项目地址:
安装Dufs
Dufs支持二进制文件安装(具体查看GitHub),也支持Docker安装,这里选择Docker安装
前置环境:
服务器上已安装Docker
安装命令:
如果为了安全考虑,不想对外暴露5000端口,可以用nginx来反向代理,详细操作查看下一步:nginx端口转发
docker run -v `pwd`:/data -p 5000:5000 --name dufs --rm sigoden/dufs /data -a $name:$password@/:rw --allow-upload
命令说明:
docker run
启动一个新的 Docker 容器。
-v `pwd`:/data
-v
: 挂载卷,将主机上的目录映射到容器内的目录。`pwd`
: 表示当前工作目录(运行命令时所在的目录),也可以是全路径,指定自己想要存放文件的目录,如/usr/local/dufs
:/data
: 将主机的当前目录挂载到容器内的/data
路径。作用: 容器内的
/data
目录可以访问主机上的文件。
-p 5000:5000
:
左侧的
5000
是服务器的对外端口。右侧的
5000
是容器内部的服务端口(Dufs 默认监听的端口)。
--name dufs
设置容器名为
dufs
--rm
--rm
: 容器停止后会自动删除,不会保留任何容器数据;避免生成多余的临时容器,适合临时任务。
sigoden/dufs
指定要运行的 Docker 镜像,
sigoden/dufs
是 Dufs 的官方镜像;需要保证能访问GitHub,如果无法访问,需要做配置加速器或手动下载
/data
Dufs 服务的根目录,表示文件服务器将以容器内的
/data
目录为基础。
-a $name:$password@/:rw
-a
:设置登录账号和密码,访问文件服务器需要登录,-A
的话就是匿名登录,无需账号密码
--allow-upload
允许上传操作
执行完命令,看到如图结果就是成功
对外开放5000端口
对云服务器的端口对外开放5000端口,可参考
就可以在浏览器访问登录文件服务器,如你的ip是192.168.1.100,就使用http://192.168.1.100:5000
访问,输入命令中设置的账号密码即可得到如图结果
nginx端口转发
由于安全考虑,不想对外暴露端口,所以考虑使用http://192.168.1.100/ss
进行访问,通过 Nginx 将路径 /ss
转发到 Docker 容器的 5000 端口,
nginx安装
参考:
安装命令:
docker run --network nginx_default -v `pwd`:/data -p 5000:5000 --name dufs --rm sigoden/dufs /data -a $name:$password@/:rw --allow-upload
--network nginx_default
--network
:将容器连接到docker网络。nginx_default
:nginx所在的docker网络名,作用:让nginx 和 dufs 在同一个docker网络中,保证nginx能访问
dufs
容器的5000端口查看nginx容器所在网络:
docker inspect -f '{{json .NetworkSettings.Networks}}' $nginx
, $nginx改为实际的nginx容器名,结果可以看到nginx的网络名,我这里是nginx_default
修改nginx配置
修改nginx.conf
文件,文件所在路径为nginx容器挂在卷设置的主机映射目录,添加以下内容:
server {
listen 80;
server_name 192.168.1.100;
location /ss/ {
rewrite ^/ss(/.*)$ $1 break; # 去掉 /ss 前缀
proxy_pass http://dufs:5000/; # 代理到 dufs 容器的 5000 端口
client_max_body_size 500m; #设置上传文件大小为500m,根据需求调整
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 处理静态资源路径
location /__dufs_v0.43.0__/ {
proxy_pass http://dufs:5000/__dufs_v0.43.0__/; # 代理到 dufs 容器的静态资源路径
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
nginx重新加载配置
docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload
问题记录
访问http://192.168.1.100/ss
报Not Found
原因:dufs
容器可能会将路径 /ss
视为静态资源的根路径,而 Nginx 可能会将 /ss
路径转发到容器的 /data
目录时发生冲突。
处理:
修改nginx.conf文件
server {
listen 80;
server_name 192.168.1.100;
location /ss/ {
# 去除路径前缀 /ss 并转发请求到容器
rewrite ^/ss/(.*)$ /$1 break;
proxy_pass http://dufs:5000/; # 代理到 dufs 容器的 5000 端口
client_max_body_size 500m; #设置上传文件大小为500m,根据需求调整
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload
页面出现布局混乱
浏览器中F12打开开发者模式查看报错为:
原因:dufs
期望静态资源在某个特定路径下,而配置的路径可能没有正确映射。特别是在 Nginx 中使用了 /ss/
路径前缀,导致静态资源的路径错误。
处理:
修改 Nginx 配置中的 rewrite
规则,以确保静态资源的路径正确。假设 dufs
服务在 /ss/
路径下运行,且静态资源位于容器的 /__dufs_v0.43.0__/
路径下,修改nginx.conf文件
server {
listen 80;
server_name 192.168.1.100;
location /ss/ {
rewrite ^/ss(/.*)$ $1 break; # 去掉 /ss 前缀
proxy_pass http://dufs:5000/; # 代理到 dufs 容器的 5000 端口
client_max_body_size 500m; #设置上传文件大小为500m,根据需求调整
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 处理静态资源路径
location /__dufs_v0.43.0__/ {
proxy_pass http://dufs:5000/__dufs_v0.43.0__/; # 代理到 dufs 容器的静态资源路径
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload
评论区