使用Docker+Seafile搭建私人网盘
私人网盘的选择
国内的网盘纷纷关闭,自建私人网盘的热潮涌起,可供选择的开源程序很多,搭建的教程很多,用的最多的无非就是ownCloud和Seafile,以及从ownCloud分裂出来的nextCloud这几种。我试用了很多开源的网盘程序,最终选择了Seafile。
- Seafile数据在服务器上是分块存储,以便支持大文件的断点续传和增量同步。
- 用客户端的情况下,数据是本地加密后再同步的。
- 当你创建一个加密资料库,为其提供一个密码。所有资料库中的数据在上传到服务器之前都将用密码进行加密。
- 全平台支持。
- 颜值很高,虽然ownCloud和nextCloud的颜值也很不错。
- 企业版提供更多的功能,并且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
seafile server name
, seafile 服务器的名字,目前该配置已经不再使用,不过安装脚本还是会提示填写。seafile server ip or domain
, seafile 服务器的 IP 地址或者域名,客户端将通过这个 IP 或者地址来访问你的 Seafile 服务。seafile data dir
,seafile 数据存放的目录,用上面的例子,默认将是/data/haiwen/seafile-data
,直接确认即可。seafile fileserver port
,seafile fileserver 使用的 TCP 端口。直接确认使用默认的8082端口。- 添加 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 # 版本号同上