利用树莓派搭建SeaFile私有云
前言:
关键字:Raspberry Pi、seafile、Linux、云、私有云;
利用SeaFile搭建私有云,如果说在传统的X86架构的主机上搭建,方法还是非常简单的,官方网站上的教程已经非常的明确[虽然经常不更新],在树莓派上搭建反而要麻烦一点。实际上,在树莓派上搭建任何的开源服务,明显都比在传统X86的服务器上架设同样的开源服务要麻烦得多,这是我的总结。实际上,博主对SeaFile、OwnCloud、NextClocud这类开源的私有云并不怎么感兴趣,主要是博主没什么这类型的需求,二是FTP对博主来说已经足够了。当然,SeaFile与FTP还是有区别的,SeaFile的主要优势是文件同步以及多类型的客户端支持上比较方便,比如说手机。
当然,SeaFile还是很符合当代人的需求的,更现化的外观、更漂亮的界面、更高的安全性[数据加密]、更简单的操作[看上去是更简单]。无论如何,在浏览器上打开自己的SeaFile私有云服务器,在外人眼中,总比你打开一个老旧的FTP客户端要显得高大上多了,不是吗?嗯,很多时候人们都习惯了喜新厌旧,从不问自己真正需要的是什么。如果你告诉别人,你会搭建私有云,外人眼中对你的印象多是“技术高超,走在时代的前端”;但告诉别人你会搭建FTP呢?印象多是“技术老旧,都什么时代了,还FTP,技术中下层……”,但事实是什么?搭建SeaFile远比搭建FTP简单……
说了这么多题外话,下面进入正题吧~
另注:下文图片仅参考,因为博客主测试的树莓派上使用的用户为“Edward”而非“pi”,但代码是没问题的~
一、硬件与软件环境
本教程在以下环境下搭建测试通过!
-
硬 件 :Raspberry Pi 3B
-
操作系统 :Raspbian Buster Lite
-
SeaFile版本 :7.1.4 [ For Raspberry Pi ]
-
Python版本 :3.7.3
-
测试日期:2020年06月19日
二、配置及安装
假设以下为一个全新配置的树莓派操作系统,系统版本为“Raspbian Buster Lite”[注:此版本系统的Python版本为3.7.3,这很重要],首先,我们使用以下命令安装相关的依赖与必要软件。需要注意的是,“python-imaging”这个包已经不再存在了,并且被“python-pil”这个包所取代,所以以下的依赖安装命令与官方略有不同,这是官方安装教程未及时更新的问题;
1 2 3 4 5 6 7 8 9 |
sudo apt-get install python sudo apt-get install python2.7 libpython2.7 python-setuptools python-pil python-ldap python-urllib3 ffmpeg python-pip sqlite3 -y sudo pip install pillow moviepy # 安装相关依赖; # 本处使用“Sqlite”数据库,SeaFile也可以使用“mysql”数据库,但配置方法不同; # 有兴趣者可以自行至官方网站了解; # 关于使用“pip”使命安装相关依赖,建议使用代理下载,数据实际上并不多, # 但如果在国内使用直连,下载速度将是……,你懂的~ # 另外,使用“pip”命令安装依赖的过程时间较长…… |
在完成依赖关系配置后,本示例将得用已经编译好的Seafile服务程序文件安装相关服务,过程如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
sudo addgroup seafile # 创建一个名为“seafile”的用户组; # 关于这一步,官方标准教程是没有的,这是一篇国外教程上的操作, # 对于这步操作本人也比较纠结,原因是博主初始考虑是以“root”的身份运行相关服务的; # 但最后考虑到Seafile是使用WEB的方式向公网提供服务,而WEB方式在公网是最容易受到网络攻击的, # 一但Seafile的WEB服务端存在漏洞,则以“root”身份运行的Seafile服务很可能会危及整个服务器, # 甚至整个家庭网络,所以综合考虑后,博主还是加入了本步操作; sudo addgroup pi seafile # 将用户“pi”添加至“seafile”用户组; # 经过上面两步操作后,这表明本处搭建的Seafile服务,在服务器上,权限将被限定为: # “pi”用户及“seafile”用户组; sudo mkdir /opt/SeafilePi # 创建“/opt/SeafilePi”目录[用于保存服务程序]; # 博主的习惯一直是将服务端安装在“/opt”目录下的,可见博客之前的其它教程; sudo chgrp seafile /opt/SeafilePi # 变更“/opt/SeafilePi”目录的所属用户组["seafile"用户组]; sudo chmod g+rwxs /opt/SeafilePi # 目录“/opt/SeafilePi”权限设定; # 组中所有用户在对应目录内拥有完整的权限; sudo reboot # 重启一下,否则一些权限未即时应用到当前系统,会造成下面的操作会出现“权限不足”的问题; |
在重启操作完成后,再次连接服务器进行以下操作;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
cd /opt/SeafilePi # 进入“/opt/SeafilePi”目录; mkdir installed # 创建“installed”目录; # 此目录主要用于保存“源安装文件”的,其实不做此步骤也可, # 但官方建议我们如此操作,参照官方文档,博主考虑了一下客户的意图, # 结论是,官方建议如此操作,是考虑到服务端的升级与回滚操作, # 所以本示例还是按官方建议; wget https://github.com/haiwen/seafile-rpi/releases/download/v7.1.4/seafile-server_7.1.4_pi-buster-stable.tar.gz # 从GITHUB下载已经编译好的基于树莓派专用的“7.1.4”版本的SeaFile安装文件; # 你也可以将压缩文件下载至任意设备中,再通过你的方法上传至该目录内; # 你也可以选择其它任意版本,注意,如果你使用了其它版本,可能需要变更一些本教程中的操作才能保证服务正常运行, # 这并不是教程原因,服务程序的编译环境本人无法控制; tar -zxvf seafile-server_7.1.4_pi-buster-stable.tar.gz # 解压“seafile-server_7.1.4_pi-buster-stable.tar.gz”压缩文件; # 这并不是官方的写法,官方写法是“tar xvf seafile-server_*”, # 本写法只是更严紧一点,官方写法存在的问题是,并不能保证“tar xvf seafile-server_*”只匹配一份文件; # 当然,如果所有人完全按照官方标准操作方法去操作,这不会存在问题, # 问题是,我们都不能保证所有人都会这样的严紧操作; mv seafile-server_7.1.4_pi-buster-stable.tar.gz installed # 解压结束后,将“seafile-server_7.1.4_pi-buster-stable.tar.gz”移动至“installed”目录内; # 这也不是官方写法,官方写法“mv seafile-server_* installed”, # 在此步也可见,完全按照官方操作,是不会存在上一步所说的问题的; # 至此步,目录结构如下图所示,见“tree -L 2”命令 |
进入对应目录,执行安装操作;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cd seafile-server-7.1.4 # 进入对应目录; # 官方写法“cd seafile-server-*” ./setup-seafile.sh # 执行安装操作,脚本执行后将要求你输入几个配置有关的信息,分别是: # 服务器名称:示例定义为“LEMONSYS” # 域名或I P:示例定义为“192.168.100.253” # 服务使用的端口:示例保持默认为“8082” # 具体配置如下图所示; # 关于域名或IP定义项说明,一般家庭或个人使用,由于没有固定的公网IP, # 所以此项一般定义为局域网内服务器的IP地址即可; # 在此环境状况下,个人或家庭要显露至公网使用最简单的方法,一般需要以下步骤: # --> 1.申请网上的动态域名服务; # --> 2.家用路由器上启用动态域名功能; # --> 3.启用家用路由器上的端口转发功能; |
此时已经安装完成了,在正式启用服务前,还需要一些额外的操作,比如说服务程序的配置,本示例只修改了最基本而必要的配置,即允许访问的入口;更多配置可参阅官方网站,比如说每个用户的可用空间上限,或上传文件的默认保存位置[本示例的默认保存位置对应为“”]等;现进行允许访问入口的配置,执行“nano /opt/SeafilePi/conf/gunicorn.conf.py”命令,将以下原文
1 2 |
# default localhost:8000 bind = "127.0.0.1:8000" |
修改为以下内容;
1 2 |
# default localhost:8000 bind = "0.0.0.0:8000" |
以上修改可设定监听地址及端口号,以上修改表示,允许所有IP地址连接服务器,服务进程运行在“8000”端口;
在完成以上额外操作后,还需要进行另一步针对树莓派SeaFile版本的另一额外操作,这是官方文档没有提到的,或者说官方的标准服务搭建文档没有提到的;另特别说明,这个操作不是通用的,要视系统的实际情况设定,但“seafile-server_7.1.4_pi-buster-stable.tar.gz”这个安装包在树莓派操作系统“Buster ”版本下是必需的,执行以下命令;
1 2 3 4 5 6 7 8 9 10 11 12 |
cd /opt/SeafilePi/seafile-server-7.1.4/seafile/lib # 进入指定的目录; ln -s python3.7 python3.6 # 为该目录内的“python3.7”目录创建一个软链接; # 其原因为,Buster版本的操作系统为内置“python3.7”, # 并且该安装包内的服务程序文件也是在“python3.7”下编译而成的, # 但对应服务的启动脚本文件未进行更新,如“seafile.sh”、“seahub.sh”等, # 这些脚本内部始终识别python的版本为“3.6”,在这样的情况下, # 程序服务的启动会引起错误;关于这种错误,官方可能随时更新, # 所以说,这步并不一定是必要的,但目前来说,不执行此步操作, # SeaFile服务将无法正常在树莓派上启动; |
手动启动服务;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
sudo localedef -i en_US -f UTF-8 en_US.UTF-8 # 这条命令并不是必要的,但这条命令能解决当使用“./seahub.sh start”命令启用服务时的以下警告信息: # “LC_ALL is not set in ENV, set to en_US.UTF-8”,简单来说说是环境变量中缺失了“LC_ALL”这个变量; # 而且这个变量比较特殊,无法使用“export”或“declare”命令进行配置; # 使用还是不使用本条命令不影响服务使用; cd /opt/SeafilePi/seafile-server-latest # 进入对应目录; # 关于“/opt/SeafilePi/seafile-server-latest”目录,这实际上是一个软链接文件, # 在本示例中,这实际上是链接至“”目录的; # 其实,通过本份文件,我们基本可以了解官方的对服务程序的升级或回滚逻辑了; ./seafile.sh start # 启用Seafile服务[这是核心部分]; ./seahub.sh start # 启用seahub服务,此部分服务就是用于提供WEB可视化界面的; # 首次启用服务,将要求建立管理员的账户与密码, # 执行安装操作,脚本执行后将要求你输入几个配置有关的信息,分别是: # 管理员账号:示例定义为“[email protected]” # 密码:示例定义为“12345678” # 服务正常启用后,你已经可以通过“192.168.100.253:8000”这个地址, # 在局域网内的任意主机上,通过WEB浏览器访问SeaFile服务了; |
停用服务;
1 2 3 4 5 6 7 8 9 |
cd /opt/SeafilePi/seafile-server-latest # 进入对应目录; ./seahub.sh stop # 停用WEB服务; ./seafile.sh stop # 停用Seafile服务; # 有没有注意,完整Seafile服务的停用与启用顺序是相反的? |
三、开机启动[SYSTEMD]
实际上经过以上操作,已经可以使用Seafile服务了[内网],但总不可能每次树莓派重启,我们都手动启用服务一次吧?我们希望Seafile服务能自动启动,于是有了下面些部分的内容。关于开机自动启用服务,有两种方式:即传统的“init”及当前的“systemd”,这两种方法官方教程均有提及,博主参考了官方代码,个人还是喜欢“systemd”方式多一点,以下内容参照官方并作了对应树莓派的修改,操作如下:
执行以下命令,在目标目录下创建“seafile.service”文件:
1 2 |
sudo touch /etc/systemd/system/seafile.service sudo nano /etc/systemd/system/seafile.service |
并在文件中输入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=Seafile After=network.target [Service] Type=oneshot ExecStart=/opt/SeafilePi/seafile-server-latest/seafile.sh start ExecStop=/opt/SeafilePi/seafile-server-latest/seafile.sh stop RemainAfterExit=yes User=pi Group=seafile [Install] WantedBy=multi-user.target |
执行以下命令,在目标目录下创建“seahub.service”文件:
1 2 |
sudo touch /etc/systemd/system/seahub.service sudo nano /etc/systemd/system/seahub.service |
并在文件中输入法以下内容,注意以下内容在官方配置中额外加入了环境变量的定义,这是在树莓派上使用“SYSTEMD”启动Seafile服务所额外的必须配置[缺少本条环境变量配置定义,SYSTEMD会在服务启动的过程中检出错误而无法启动],关于“LC_ALL=en_US.UTF-8”这个变量的说明见上文:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Unit] Description=Seafile hub After=network.target seafile.service [Service] ExecStart=/opt/SeafilePi/seafile-server-latest/seahub.sh start ExecStop=/opt/SeafilePi/seafile-server-latest/seahub.sh stop User=pi Group=seafile Type=oneshot RemainAfterExit=yes Environment='LC_ALL=en_US.UTF-8' [Install] WantedBy=multi-user.target |
特别说明,以上配置文件的配置代码是没有错的,但在你复制这些代码的过程中,可能会产生特殊字符的错误问题,这些特殊字符是无法从视觉上分别的,常出现字符问题的特殊字符包括空格、换行符、英文标点符号等;以下代码复测过程中一个偶然示例,注意,这是同一份文件,未作任何修改,在“vim”与“nano”命令下的区别,竟然多出了莫名其妙的字符[注意“RemainAfterExit=yes”这条配置项],造成服务无法正常启动,见下面图片;说实施,博主经常在WINDOW下利用SSH连接至服务器搭建服务的,字符问题常常把博主搞得焦头烂额!!!!!!!!!
设定Seafile服务开机自启动、测试及状态查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sudo systemctl daemon-reload # 刷新SYSTEMD服务的配置信息; sudo systemctl enable seahub.service # 设定“seahub.service”服务自启; sudo systemctl enable seafile.service # 设定“seafile.service”服务自启动; sudo reboot # 重启测试效果 sudo systemctl status seafile.service sudo systemctl status seahub.service # 使用以上命令查看服务状态; |
四、配置定义
关于SeaFile的可定义配置项并不多,而且一些配置官方已经不使用了,所以实际的可配置项目更少,由于此部分内容难以总结,所以读者自己至官方网站查询即可,其配置文件均保存在“/conf”目录,下面仅对配置文件作一个简单的说明;另外补充,一些配置文件在这个安装包中并没有默认创建,读者若想使用该部分功能,创建对应配置文件即可;
1 2 3 4 5 6 7 8 9 10 |
tree -L 2 /opt/SeafilePi/conf # /opt/SeafilePi/conf # ├── ccnet.conf # 基本弃用,只剩下URL一个可配置项 # ├── gunicorn.conf.py # 本份文件最重要的配置项是访问控制配置项 # ├── __pycache__ # │ ├── gunicorn.conf.cpython-37.pyc # │ └── seahub_settings.cpython-37.pyc # ├── seafdav.conf # 官方文档未说明[不想查了] # ├── seafile.conf # SEAFILE服务的主配置文件 # └── seahub_settings.py # SEAHUB服务主配置文件 |
关于Seafile服务的数据保存位置;令我很好奇的是,Seafile并没有在其配置文件中提供自定义数据保存位置的配置项,默认情况下,数据均保存在“./seafile-data”中[上面的截图中有提示过],不评论其优点与缺点了,如果真想修改数据的默认保存目录,有以下两个方法:1.对使用“”目录使用软连接或挂载其它磁盘至该目录上;2.使用“ps -aux | grep seafile”命令查询“seafile.sh”脚本实际执行的命令[查询后将会发现,实际执行的是一个名为“seafile-controller”程序,并且其数据的保存位置由一个“-d”选项所指定],然后使用对应的命令运行Seafile服务即可;
五、参考
这是楼主参考的一些文章,读者遇到问题可参考;
1 2 3 4 5 6 7 8 |
https://medium.com/swlh/building-a-file-server-on-a-raspberry-pi-with-seafile-d972bad14688 # 一篇安装教程,通过这份教程我并没有成功搭建起服务,但有参考作用; https://github.com/haiwen/seafile-rpi/releases # 基于树莓派Seafile的开源项目; https://forum.seafile.com/t/seafile-server-7-1-4-for-raspberry-pi-is-ready-23-05-2020/11945 # 官方基于树莓派Seafile项目的发布页,上面有很多不同问题的解决方法; |
六、结
反正博主暂时并没有使用SEAFILE的想法,关于SEAFILE中上传的文件数据,是强制加密的,所以像博主这种FTP保存数据的来说,原来的数据迁移至SEAFILE并不方便;数据加密对企业来说非常重要,但对个人用户来说,其重要性可能就没这么重要了;而博主认为最关键的一点是,对于个人用户来说,其建立的SEAFILE是不稳定的,是容易发生问题的,这一额外的加密措施,很可能加剧了当SEAFILE服务出现问题时,用户恢复数据的难度。如果对加密并没有额外的需求,博主认为,读者可以考虑一下OwnCloud或NextCloud这两个开源的私有云,其上传的文件并不强制加密,这也意味着,你原有的数据在迁移上非常方便~
成功了,非常感谢,不过当前是用树莓派,怎么挂硬盘,要是有教和一就好了
2021-03-04 上午12:20$ blkid
2021-03-09 下午10:35/dev/sda1: UUID="58c86c5a-9c2c-4b9c-bfd0-db64283ea88e" TYPE="ext4" PARTUUID="804797c8-01"
....
$ cat /etc/fstab
...
UUID=58c86c5a-9c2c-4b9c-bfd0-db64283ea88e /Data ext4 defaults,noatime 0 0
...
非常感谢,你的教程特别全。希望能坚持下去!
2020-11-02 上午9:58