一、背景

搭建NAS应该是家用服务器最常规的操作了。但是,搭建NAS一般都是通过samba或者nfs来实现。好处是局域网中无论是windows、Linux还是MacOS,又或者是手机、电视都可以很轻松地进行访问。但是,如果想通过互联网访问,就会比较麻烦了。因为缺少有效的访问控制,把这些服务开放到互联网会带来极大的安全风险。曾经很多局域网中横向的木马和病毒,就是利用的samba的漏洞。即使抛开漏洞不谈,它也缺少灵活的共享机制。一个文件已经可以通过互联网访问了,那么,把它分享给别人的需求也就再自然不过的需要了。这个时候局域网共享的这类就完全无法满足了。

之所以不能满足,不是因为局域网共享这类技术做的不够好。而是,局域网中倾向于天然信任对方。以信任为基础,做一些管控。也就是说先把所有权限都提供,然后再在这个基础上做减法,比如砍掉写权限、禁止掉执行权限等等。但是,互联网是个大江湖,人心险恶,自然不能以信任为基础。而是以不信任为基础,首先,啥权限都没有。在这个基础上做加法。给部分文件或目录的可读权限。

关于网盘,曾经很是风靡过一阵子。当时,各家大厂都推出过自己的网盘服务。有些甚至可以直接在windows下挂载成盘符,使用体验上除了比本地磁盘慢点并没有太大的差别。但是,由于各家都没有找到盈利点,最终活下来的已经寥寥无几了。使用体验也跟当年无法匹及。现在大家最常用的估计就是百度网盘了。但是,又都非常痛恨百度网盘的限速。当然,也有不限速的,比如阿里云盘。但是,阿里云盘限制文件类型。最最重要的,文件交到这些大厂手中非常的不放心。鬼知道那天说关就关了。当年,各大网盘竞相关闭的场景依旧历历在目。很多人,从知道要关闭就开始连夜挂机往回拖数据,然而直到最终停服也未能完全下载完。

总的来说,数据还是要放在自己手上才安全。今天咱们就在魔百盒中搭建一个自己的网盘应用。

开源的网盘应用有很多,可以根据自己的需要进行选择,这儿推荐几款。

二、NextCloud

github地址:https://github.com/nextcloud

官网:https://nextcloud.com/

image-20241117190316495

可以用来存储文件,包括但不限于照片、视频、办公文件等等。不仅可以存储,还可以进行共享和分享操作,也可以进行在线预览和编辑。

也可以用来存储联系人和日历。另外,它还提供了上百个插件用来扩展功能,如果需要你也可以自己写一个插件。

同时,它还提供了网页、Windows、MacOS、Linux、安卓和iOS等各个平台的App。可以方便的进行数据同步。

还有一点特别好,就是它提供了WebDAV接口可以和Joplin一起配合实现多端个人笔记同步。事实上,这也是我个人使用它的唯一原因。

为啥呢?因为它存在一个无法解决的痛点。不只是它,大多网盘软件都存在这个问题。对于个人使用而言,将数据放在一个应用内部并不是一个很好的做法。为啥呢?不方便互通交流。比如我有一个视频,如果放在NextCloud里面。如果想要打开它就必须通过它的App下载下来,然后,再打开。于是,要么安装一个App,要么必须通过浏览器下载后才可以使用。对于局域网内的共享就会比较麻烦。尤其是很多电视、盒子和投影仪,安装App或者使用App都会有很多不便。但是,访问samba就会非常轻松。尤其是,有时候是Linux控制台界面,就更加难以访问它了。当然,它也提供了一个叫做外部存储器的插件,来解决这个痛点。然而,外部存储器里面的文件不能共享。如果想要共享比如复制到NextCloud的内置存储里面,非常傻不说,还很麻烦。

2.1 部署方法

最简单也是最方便的部署方法当然是用docker了,一行代码就可以实现:

docker run -it -v 80:80 -v `pwd`/nextcloud:/var/www/html nextcloud

运行起来以后,在浏览器里面,访问:http://127.0.0.1 就可以访问了,按照提示即可完成安装。

如果注意的是:如果个人简单使用的话,数据库可以使用内置的sqlite。但是,如果文件比较多或者使用的人较多,建议还是配合MySQMariaDB或者PostgreSQL更好。另外,后期换数据库的话,是比较麻烦的,长期使用的话,还是建议一步到位。

但是,这种启动方式临时用一下还可以,如果长期使用,还需要以下几点。

  1. 存储与系统分离

    把数据放到独立的硬盘中,不要跟系统放在一起。比如一个独立的硬盘空间来存放数据,同时,对这块硬盘组件raid,有或者定时进行热备、冷备。

  2. 注册成服务,以便服务器重启后自动拉起。

2.2 启动脚本

启动脚本可以放在任意目录下面,例如:放在/opt/nextcloud.sh

#!/bin/bash

repository=nextcloud
#tag=latest
tag=30
name=nextcloud
container_id=`docker ps -a --filter "name=$name" --format "{{.ID}}"`
if [ "$container_id" != "" ]; then
        echo "Stopping ${name} container..."
        docker rm -f ${container_id} >> /dev/null
fi

path=/mnt/nas/${name}

function check_path()
{
  DATA_DIR=$1
  sec=5
  ls $DATA_DIR >> /dev/null 2>&1
  while [ ! -e ${DATA_DIR} ]; do
    echo "Error: Not exist ${DATA_DIR}!"
    sleep $sec
    sec=$((sec+5))
    if [ $sec -gt 60 ]; then
      sec=60
    fi
    ls $DATA_DIR >> /dev/null 2>&1
  done
}

check_path $path

PARAM="-p 8080:80"
PARAM="${PARAM} --restart=always"
PARAM="${PARAM} --privileged=true"
PARAM="${PARAM} --ulimit core=0"
PARAM="${PARAM} -v /etc/localtime:/etc/localtime:ro"
PARAM="${PARAM} -v /etc/timezone:/etc/timezone:ro"
PARAM="${PARAM} -v ${path}/html:/var/www/html"
PARAM="${PARAM} --name ${name}"

docker run -itd ${PARAM} ${repository}:${tag}
if [ $? -ne 0 ]; then
        exit $?
fi

exit 0

其中,主要的功能:

  • 由于NextCloud不支持跨版本升级,所以,我没有使用latest,而是指定了版本号。好处是,方便后期迁移维护。如果用latest的话,如果换系统就会容易出现跨版本导致无法使用的问题。
  • 如果已经运行了,就杀掉重新运行。这个相当于重启服务了。注意,这儿是针对个人使用,对于重启没有那么多顾虑。如果是团队和公司,那就要考虑考虑了。
  • 接下来是检查存储目录是否存在。我把NextCloud的数据都存在了/mnt/nas/nextcloud目录下面,nas其实一个硬盘,使用的时候会通过autofs进行按需挂载。所以,在开启自动启动的时候,需要等待autofs完成挂载。
  • 最后是docker的各种运行时参数,这儿不再详细解读,不清楚的小伙伴可以去看一下docker的菜鸟教程。

2.3 服务配置

为了实现开机自启动,可以看需要创建一个systemd的服务配置文件:nextcloud.service

[Unit]
Description=nextcloud docker 
After=syslog.target docker.service remote-fs.target networking.service autofs.service

[Service]
Type=simple
ExecStart=/opt/nextcloud.sh
# ExecReload=target_dir/restart.sh 
# ExecStop=target_dir/shutdown.sh
SuccessExitStatus=0

[Install]
WantedBy=multi-user.target

将该文件存入/etc/systemd/system目录下面,然后执行

sudo systemctl daemon-reload # 重新加载配置
sudo systemctl enable nextcloud # 开启开机自动启动
sudo systemctl start nextcloud # 启动NextCloud容器
sudo systemctl restart nextcloud # 重启NextCloud容器

如果想停止容器可以直接使用docker命令docker rm -f nextcloud实现。

三、FileBrower

github地址:https://github.com/filebrowser/filebrowser

官网:https://filebrowser.org/

试用地址:https://demo.filebrowser.org/ 【账号和密码都是demo】

它跟NextCloud不同的是,它没有提供数据存储器,而是直接那操作系统的文件系统作为数据存储的容器。在FileBrower中看到的文件就是你本地文件管理器里面的文件。

它所做的就是为本地数据提供了一个通过Web页面访问的能力。同时,提供了访问控制、共享和预览的等各种功能。这正是,我想要的。

  • 在局域网,无论是手机、平板、电脑还是电视、投影仪,都可以通过samba访问的数据。
  • 在互联网,可以通过浏览器进行访问,可以上传、下载或者进行分享。

image-20241117193347860

3.1 部署方法

跟NextCloud类似,只需要一行代码就可以实现:


docker run -it -v 8080:8080 \
 -v config/filebrowser.db:/database.db \
 -v config/.filebrowser.json:/.filebrowser.json \
 -v data:/srv \ 
 filebrowser/filebrowser

当然,如果想要自动启动,还需要创建systemd的服务配置文件,可以参考NextCloud里面的做法。

四、FileBrower(二次开发版本)

官方版本FileBrowser中缺少几个对我而言很重要的功能:

1、收藏夹

​ 与Explorer类似,将某个目录收藏与左侧,以便快速访问。

2、共享链接的访问记录、快捷访问方式、隐藏路径、多共享连接。

​ 官方版本提供的共享比较简单。缺少很多重要的功能,于是,做了补充。当时,还缺少一个很重要的能力——共享上传。等有空的时候再加。

3、回收站。

​ 类似于Windows的回收站功能。

4、对接外部预览服务器。

​ 比如对接kkview实现各种文件的在线预览,包括doc/ppt/xls/wps、pdf、音视频文件等等。

github地址:https://github.com/xxnull-lsk/filebrowser

share

favorite

4.1 部署方法

跟官方版本一样,最简单也是通过docker部署,一行命令即可实现。

docker run -it -v 8080:8080 \
 -v config/filebrowser.db:/database.db \
 -v config/.filebrowser.json:/.filebrowser.json \
 -v data:/srv \
 xxnull/filebrowser

五、其他

这两个是我用的比较多的。除了这两个还有很多,例如seafile蓝眼云盘KodExplorer