通过seafile搭建私有云存储平台

背景

在以前,Dropbox还能用,Google Drive也能用的时候,在多台机器之间进行文件的上传、下载和同步是一件很方便的事;
在以前,微盘能用,360云盘能用,百度云盘能用的时候,在多台机器之间共享文件也是不错的;
而后来,Dropbox不能用了,Google Drive不能用了,微盘、360云盘、XXX盘也不能用了,百度云盘说不定哪天也倒了。

是时候搭建自己的私有云平台了。

然后调研了两个私有云平台:seafile 与 owncloud。前者是国内开源的,后者是国外做的。并找了一些资料进行比较,比如:seafile 与 owncloud 在企业内网的使用体验如何?以及
准备搭建一个私有云平台,对比owncloud、迷你云、seafile,孰优孰劣?,这里就不再列了,想看的点这两个链接了解下。

seafile介绍

结论就是我优选seafile试用了,除了以上链接中的对比,我发现的另外的优点就是安装简单,以及安装、使用界面都是中文的,操作友好。

Seafile是一个开源、专业、可靠的云存储平台;解决文件集中存储、共享和跨平台访问等问题,由北京海文互知网络有限公司开发,发布于2012年10月;除了一般网盘所提供的云存储以及共享功能外,Seafile还提供消息通信、群组讨论等辅助功能,帮助更好的围绕文件展开协同工作。

主要功能:

  1. 文件同步与共享
    你可以创建不同的资料库来分类组织文件。可以在私人间或群组中共享这些资料库。每个资料库都可以选择性的在多台设备上同步。
  2. 在线协作
    你可以在线编辑文件,对文件进行评论,在私人间或群组间展开讨论。事件通知、版本管理使得文件协作异常的方便和安全。
  3. 移动办公
    移动客户端使得你可以在移动设备上查看最新改动、访问文件资料、进行群组讨论等等,方便的完成移动办公。

适用平台:

  • Seafile服务器支持主流的Linux发行版,Windows服务器以及Raspberry Pi。
  • Seafile桌面客户端支持Windows, Linux以及MacOS。
  • Seafile移动客户端支持Android和IOS。

安装seafile

seafile server的安装很简单,点此查看官网的中文安装说明
我这里并没有按照官网介绍的步骤进行安装,而是通过docker进行部署的,下面就简单介绍下通过docker安装的步骤。

你需要的仅仅是:

  • 一个云主机(必选)
  • 一个域名(可选,通过域名访问更好记)
  • 域名解析(可选,将自己的域名解析到云主机的公网ip上)
  • nginx服务(可选,便于绑定域名)
  • docker(可选,因为可以直接在主机中安装seafile)

以下是我的系统环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$ uname -a
Linux VM_19_73_centos 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ docker version
Client:
Version: 1.10.3
API version: 1.22
Package version: docker-common-1.10.3-46.el7.centos.14.x86_64
Go version: go1.6.3
Git commit: cb079f6-unsupported
Built: Fri Sep 16 13:24:25 2016
OS/Arch: linux/amd64
Server:
Version: 1.10.3
API version: 1.22
Package version: docker-common-1.10.3-46.el7.centos.14.x86_64
Go version: go1.6.3
Git commit: cb079f6-unsupported
Built: Fri Sep 16 13:24:25 2016
OS/Arch: linux/amd64

下载镜像

jenserat/seafile镜像包含了Seafile运行的依赖环境和一些方便的脚本,使用docker pull jenserat/seafile:latest拉取该镜像的最新版本。
说明,我部署本服务的时候,也是刚刚接触docker,从我部署后的经验来看,并不需要上文提及的这个seafile镜像,其实随便一个可使用镜像都可以,因为接下来还是要自己安装seafile服务的。

启动容器

假设你提前下载了seafile server安装包,比如我下载的是seafile-server_6.0.6_x86-64.tar.gz,且放在了主机的/usr/local/seafile目录下,并希望将主机的/usr/local/seafile目录挂载到即将创建的容器中的/usr/local/seafile目录:

docker run -t -i --name myseafile -p 127.0.0.1:10001:10001 -p 127.0.0.1:12001:12001 -p 127.0.0.1:8000:8000 -p 127.0.0.1:8080:8080 -p 127.0.0.1:8082:8082 -v /usr/local/seafile:/usr/local/seafile jenserat/seafile -- /bin/bash

以上命令的意思就是创建该容器,名字为myseafile,对以上端口做了端口映射。
注意:

1. 我这里是将主机的容器中的8000端口映射到主机的127.0.0.1:8000,因为我的主机有外网IP,不希望通过外网IP直接访问seafile服务(待会设置成通过域名访问),如果需要直接通过ip访问到seafile服务,则把127.0.0.1删掉即可;  
2. 像10001,12001端口,从我事后的使用上来看,并没有使用上,应该是可以去掉的;

部署seafile

在容器中进行以下步骤:

cd /usr/local/seafile
tar -xf seafile-server_6.0.6_x86-64.tar.gz
cd seafile-server-6.0.6
sh ./setup-seafile.sh 

就开始了安装过程,注意:安装过程中需要观察提示信息,有时只需要按下enter键确认,有时需要我们手动输入一些信息。总体很简单,这里不再说(我是安装完成之后才打算写这篇文章的,所以那些细节就不再列了)。

运行seafile服务

运行seafile server需要启动两个服务,seafile服务是文件管理引擎,seahub提供网页访问服务。另外seahub首次启动时会要求输入管理员邮箱及密码。

./seafile.sh start
./seahub.sh start      # 这一步需要输出管理员邮箱及密码

现在用浏览器打开http://:8000,看到登录页面说明配置完成了。当然我的配置下是不能的,因为我把容器中的8000端口只映射到了主机的127.0.0.1上了。不过可以通过以下命令验证服务是否启动:

curl http://127.0.0.1:8000

如果没有报错(拒绝连接),说明服务是运行起来的。

配置nginx反向代理

自行安装nginx服务,然后配置seafile的代理,也简单:

server {        
     listen       80;
     server_name  cloud.cpper.cn;
     client_max_body_size 100m; 
     access_log  /var/log/nginx/seafile.log;

     location / {
          proxy_pass http://127.0.0.1:8000/;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_buffering off;
     }
     location /seafhttp { 
          rewrite ^/seafhttp(.*)$ $1 break;
          proxy_pass http://127.0.0.1:8082/;
          client_max_body_size 0;
          proxy_connect_timeout  36000s;
          proxy_read_timeout  36000s;
     }
     location /media {
         root  /usr/local/seafile/seafile-server-latest/seahub;
     }
     error_page 404 /404.html;
         location = /40x.html {
     }
     error_page 500 502 503 504 /50x.html;
         location = /50x.html {
     }
 }

此时通过浏览器打开http://cloud.cpper.cn即可以访问seafile服务了。
注意这里的配置中有一个location段/seafhttp,这个需要我们登录seafile服务之后,再后台进行设置:

alt text

退出docker 容器

完成第3,4步时,当时的操作都在容器内,因为是按前台方式运行的,如果退出容器,服务就不可以访问了,这里需要先exit退出该容器,然后再启动,并进去再次运行服务:

exit   # 退出容器(在容器中操作)
docker start myseafile # 重新启动容器(在主机中操作)
docker exec -it myseafile /bin/bash   # 重新attach到容器中(在主机中操作)
./seafile.sh start          # 启动容器中的服务(在容器中操作)
./seahub.sh start 
CTRL + d 或者exit  # 退出容器(在容器中操作)

到这里就可以正常使用了。

安装seafile客户端

seafile客户端支持linux、windows、ios、android平台,可以自行安装。

关于docerk

其实不使用docker,而是直接在主机上部署反而更简单,那为什么还要用docker呢?
我不过是借这个机会熟悉熟悉docker,对,就是练手docker的使用,因为我也刚接触这玩意,但是感觉很赞。
所以就这么折腾了。

因为对docker还不熟悉,这里的折腾我事后感觉太罗嗦了,等我再研究下docker的使用,再把这里的步骤完善下。

更新(2016-12-06)

因为我之前的云服务器只有1G内存,上面跑了nginx、apache httpd、gogs、seafile以及几个脚本,使得内存不足(seafile相对占得多),导致我提交博客文档并触发本机的脚本自动拉取git并通过hexo重建时,总是报Killed的错误,所以我决定升级下服务器配置,内存从1G加到2G。
悲催的是我当时购买云服务器时,硬盘可以选择云盘或者传统硬盘,而我无脑选择的是传统硬盘,导致升级内存时无法无缝升级,只得先买一个新的云服务器,然后将所有数据和服务再拷贝过去!!!

其他的迁移都好办些,因为seafile是我用docker装的,且安装的时候不规范(刚接触docker,一些地方看不懂就部署了),迁移起来没那么方便了。经过上周末我测试一番,最终决定采用seafile-docker的做法:

安装:

1
2
3
4
5
6
7
8
docker run -t -i \
-p 10001:10001 \
-p 12001:12001 \
-p 8000:8000 \
-p 8080:8080 \
-p 8082:8082 \
-v /srv/seafile:/opt/seafile \
jenserat/seafile -- /bin/bash

当时我没看明白,周末终于搞定了,尤其要注意这里映射的/opt/seafile路径,必须要把seafile服务程序目录映射到这个目录下,否则以后就无法自动启动seafile服务了。

使用:

1
2
3
4
5
6
7
8
9
10
docker run -d \
--name seafile \
-p 10001:10001 \
-p 12001:12001 \
-p 8000:8000 \
-p 8080:8080 \
-p 8082:8082 \
-v /srv/seafile:/opt/seafile \
-e autostart=true \
jenserat/seafile

说明:原来的数据、文档在本地迁移时并没有丢失,只是做法上有点别扭(把seafile服务程序映射到/opt/seafile下,把数据目录映射到/usr/local/seafile目录下,因为我最初就是在这个目录的。。。),还好还可以接受。

参考

念念不忘,必有回响