使用Docker+Seafile搭建私人网盘

私人网盘的选择

国内的网盘纷纷关闭,自建私人网盘的热潮涌起,可供选择的开源程序很多,搭建的教程很多,用的最多的无非就是ownCloud和Seafile,以及从ownCloud分裂出来的nextCloud这几种。我试用了很多开源的网盘程序,最终选择了Seafile。

  1. Seafile数据在服务器上是分块存储,以便支持大文件的断点续传和增量同步。
  2. 用客户端的情况下,数据是本地加密后再同步的。
  3. 当你创建一个加密资料库,为其提供一个密码。所有资料库中的数据在上传到服务器之前都将用密码进行加密。
  4. 全平台支持。
  5. 颜值很高,虽然ownCloud和nextCloud的颜值也很不错。
  6. 企业版提供更多的功能,并且3用户以下免费。

后端用Docker部署Seafile

Seafile自带web服务器,但是不同的服务对应着不同的端口,对于宿主机来说,开放了太多的端口并不好管理。所以在容器内运行nginx或apache从而只将一个端口映射到宿主机是个很不错的选择。在官方的公共仓库Docker Hub中搜索Seafile,找到了cmnelson/docker-seafile-pro-nginx,这是一个包含了nginx的Seafile Pro版本的镜像,使用非常方便,不过遗憾的是作者最近一次commit是在1月26日,而Seafile Pro的版本上个月已经更新至6.0.8。

为了可以运行最新的Seafile,我打算自己 docker build 镜像。

git clone https://github.com/cmnelson/docker-seafile-pro.git
cd docker-seafile-pro

编辑Dockerfile,将 ENV SEAFILE_VERSION 6.0.7 修改成 ENV SEAFILE_VERSION 6.0.8

webdav默认是关闭的,需要编辑 seafdav.conf 将其打开,这一步稍后操作,先编辑 config/seafile.conf ,加入相应的nginx配置:

 location /seafdav {
    fastcgi_pass    127.0.0.1:8080;
    fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
    fastcgi_param   PATH_INFO           $fastcgi_script_name;

    fastcgi_param   SERVER_PROTOCOL     $server_protocol;
    fastcgi_param   QUERY_STRING        $query_string;
    fastcgi_param   REQUEST_METHOD      $request_method;
    fastcgi_param   CONTENT_TYPE        $content_type;
    fastcgi_param   CONTENT_LENGTH      $content_length;
    fastcgi_param   SERVER_ADDR         $server_addr;
    fastcgi_param   SERVER_PORT         $server_port;
    fastcgi_param   SERVER_NAME         $server_name;

    client_max_body_size 0;

    access_log      /var/log/nginx/seafdav.access.log;
    error_log       /var/log/nginx/seafdav.error.log;
}

然后运行 sudo docker build -t xiaoguo/seafilepro:v6.0.8 . ,创建镜像。

镜像创建完成后,首先需要运行安装脚本并回答预设问题:

docker run -it --rm \
    --name=seafile-setup \
    -v /var/seafile:/seafile \
    xiaoguo/seafilepro:v6.0.8 setup
  1. seafile server name , seafile 服务器的名字,目前该配置已经不再使用,不过安装脚本还是会提示填写。
  2. seafile server ip or domain , seafile 服务器的 IP 地址或者域名,客户端将通过这个 IP 或者地址来访问你的 Seafile 服务。
  3. seafile data dir ,seafile 数据存放的目录,用上面的例子,默认将是 /data/haiwen/seafile-data ,直接确认即可。
  4. seafile fileserver port ,seafile fileserver 使用的 TCP 端口。直接确认使用默认的8082端口。
  5. 添加 admin 用户帐号, 密码。

安装配置完成后,自动退出容器。刚提到webdav默认关闭,现在我们需要在配置文件中将其打开。

编辑 /var/seafile/conf/seafdav.conf ,最终代码如下:

[WEBDAV]
enabled = true
port = 8080
fastcgi = true
share_name = /seafdav

至此安装配置全部完成,可以运行容器了。

docker run -d \
    --name=seafile \
    -p 8000:80 \
    -v /var/seafile:/seafile \
        xiaoguo/seafilepro:v6.0.8

这时在浏览器打开 ip:8000 便可以访问网盘了。

前端Nginx反向代理

前段其实就是在另一台服务器上安装的nginx,这个配置非常简单,下面的配置文件仅作参考。

server {
    server_name       xxx.com;
    server_tokens     off;
    access_log        /dev/null;

    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
	return        444;
    }

    location / {
	rewrite       ^/(.*)$ https://xxx.com/$1 permanent;
    }
}

server {
    listen 443 ssl;
    server_name                 xxx.com;
    server_tokens               off;
    ssl on;
    ssl_certificate /home/xiaoguo/www/ssl/xxx.com.cer;
    ssl_certificate_key /home/xiaoguo/www/ssl/xxx.com.key;

    ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;

    access_log                 /home/www/nginx_log/seafile.log;

    location / {
	proxy_pass  http://ip:8000;

	#Proxy Settings
	proxy_redirect     off;
	proxy_set_header   Host             $host;
	proxy_set_header   X-Real-IP        $remote_addr;
	proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
	proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
	proxy_connect_timeout      36000s;
	proxy_send_timeout         36000s;
	proxy_read_timeout         36000s;
	proxy_buffer_size          16k;
	proxy_buffers              4 64k;
	proxy_busy_buffers_size    128k;
	proxy_temp_file_write_size 128k;
   }
}

升级Seafile

编辑Dockerfile 编辑Dockerfile,将 ENV SEAFILE_VERSION 修改成最新的服务器版本。

sudo docker stop seafile
sudo docker rm seafile
sudo docker rmi xiaoguo/seafilepro:v6.0.8 # 版本号自行修改

sudo docker build -t xiaoguo/seafilepro:v6.0.8 . 创建新的镜像之后

docker run -it --rm \
    --name=seafile-setup \
    -v /var/seafile:/seafile \
    xiaoguo/seafilepro:v6.0.8 upgrade # 同样自行修改版本号

升级时间视数据库大小而定,因为的升级过程中会备份之前的数据文件 seafile-pro-server-6.0.X-backup.tar.gz 放在 backup/ 目录下,避免空间浪费的话可以选择性删除。至此升级操作暂时完成,可以运行容器了。

之所以说是暂时完成,这是因为目前的Dockerfile存在一点小小的问题, seafile-server-latest 并没有软链到新的服务器版本源码上,需要 sudo docker exec -it seafile /bin/bash 进入容器后重新生成软链。

unlink seafile-server-latest
ln -s seafile-pro-server-6.0.8/ seafile-server-latest # 版本号同上

更新记录

  • [2017-05-10 Wed] 新增升级教程

本页最后更新时间:2017-07-11 Tue 22:01.
小过的布拉格 - Copyright©2013-2017 - @xiaoguo - Powered by Emacs 26.1 (Org mode 9.1.1)
行路难,行路难, 多歧路,今安在。长风破浪会有时,直挂云帆济沧海。