侧边栏壁纸
博主头像
babajaja博主等级

种一棵树最好的时机是十年前,其次是现在。

  • 累计撰写 6 篇文章
  • 累计创建 7 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

快速搭建一个文件服务器-Dufs

babajaja
2024-12-20 / 0 评论 / 0 点赞 / 80 阅读 / 9300 字

背景

日常生活中难免要发送一些文件,但现在网盘基本都要开会员,不然下载会限速;通过wx发送文件很快,但是一些特殊的文件,如apk文件的话,会被改为apk.1 ,所以就自己在服务器上搭个文件服务器,方便文件传输

对比

问一下chatGPT,确定选择Dufs来搭建

项目地址: https://github.com/sigoden/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端口,可参考https://babajaja.cn/archives/kubernetes-install#9.-%E5%BC%80%E9%80%9A%E7%AB%AF%E5%8F%A3

就可以在浏览器访问登录文件服务器,如你的ip是192.168.1.100,就使用http://192.168.1.100:5000 访问,输入命令中设置的账号密码即可得到如图结果

nginx端口转发

由于安全考虑,不想对外暴露端口,所以考虑使用http://192.168.1.100/ss 进行访问,通过 Nginx 将路径 /ss 转发到 Docker 容器的 5000 端口,

nginx安装

参考:https://babajaja.cn/archives/docker-compose-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

0

评论区