Seafile 是一款开源的企业云盘,注重可靠性和性能。支持 Windows, Mac, Linux, iOS, Android 平台。支持文件同步或者直接挂载到本地访问。Seafile目前分为免费版和专业版,两者都可以免费使用。专业版只支持三个用户免费,免费版本不限制使用人数。但是专业版多了搜索、集群、亚马逊S3、Ceph、阿里云OSS等功能。 本文介绍的是使用Docker安装专业版Seafile。

1
Starting with 7.0, we have adjusted seafile-docker image to use multiple containers. The old image runs MariaDB-Server、Memcached and Elasticsearch in the same container with Seafile server. Now, we strip the MariaDB-Server、Memcached and Elasticsearch from the Seafile image and run them in their respective containers.

安装 docker-compose

因为 Seafile v7.x.x 容器是通过 docker-compose 命令运行的,所以您应该先在服务器上安装该命令。

1
2
3
4
# for CentOS
yum install docker-compose -y
# for Ubuntu
apt-get install docker-compose -y

获取Seafile docker仓库的用户名和密码

打开网址:https://customer.seafile.com/downloads/,按照提示注册后,会显示登录信息,注意不要复制到最后面的点,如下图

然后登录seafile的仓库,根据提示输入用户名和密码。

1
2
3
4
5
#登录仓库地址docker.seadrive.org,输入给你的用户名和密码即可
docker login docker.seadrive.org

#pull镜像
docker pull docker.seadrive.org/seafileltd/seafile-pro:latest

下载和修改 docker-compose.yml

下载 docker-compose.yml .示例文件到您的服务器上,然后根据您的实际环境修改该文件。尤其是以下几项配置:

  • MySQL root 用户的密码 (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)
  • 持久化存储 MySQL 数据的 volumes 目录 (volumes)
  • 持久化存储 Seafile 数据的 volumes 目录 (volumes)
  • 持久化存储 Elasticsearch 索引数据的 volumes 目录 (volumes)
  • 还有seafile端口的端口8000:8000,8082:8082
1
2
3
4
#需要加上启动选项 
.....
restart: "always"
.....

启动服务器

docker-compose.yml所在的文件夹运行如下命令:

1
docker-compose up -d

开放服务器端口8000和8082;

稍等,可以通过 http://seafile.example.com 打开 Web UI.

注意:需要修改conf文件夹下的gunicorn.conf

1
bind = "0.0.0.0:8000"

更新 Seafile server

1
2
docker pull {host}/seafileltd/seafile-pro-mc:latest
docker-compose downdocker-compose up -d

客户端下载

客户端下载:https://www.seafile.com/download/,安装后打开客户端,直接填入域名,用户名和密码登录即可。

使用 Let's encrypt SSL 证书

如果您把 SEAFILE_SERVER_LETSENCRYPT 设置为 true,该容器将会自动为您申请一个 letsencrypt 机构颁发的 SSL 证书,并开启 https 访问,为此您需要做如下配置:

1
2
3
4
5
6
7
8
9
10
seafile:    ...    
ports:
- "80:80" # 这是没有用自定义端口的情况
- "443:443" # 这是没有用自定义端口的情况
...
environment:
...
- SEAFILE_SERVER_LETSENCRYPT=true
- SEAFILE_SERVER_HOSTNAME=seafile.example.com
...

如果您想要使用自己的 SSL 证书,而且如果用来持久化存储 Seafile 数据的目录为 /opt/seafile-data,您可以做如下处理:

  • 创建 /opt/seafile-data/ssl 目录,然后拷贝您的证书文件和密钥文件到ssl目录下。

  • 按照如下示例修改 Nginx 的配置文件/opt/seafile-data/nginx/conf/seafile.nginx.conf请不要更改该配置文件的文件名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    server {    
    listen 80;
    server_name example.seafile.com default_server;

    location / {
    rewrite ^ https://$host$request_uri? permanent;
    }
    }

    server {
    listen 443;
    ssl on;
    ssl_certificate /shared/ssl/your-ssl-crt.crt;
    ssl_certificate_key /shared/ssl/your-ssl-key.key;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

    server_name example.seafile.com;
    ...
  • 重新加载 Nginx 的配置文件:

1
docker exec -it seafile /usr/sbin/nginx -s reload

备份和恢复

目录结构 我们假设您的 seafile 数据卷路径是 /opt/seafile-data,并且您想将备份数据存放到 /opt/seafile-backup 目录下。

您可以创建一个类似以下 /opt/seafile-backup 的目录结构:

1
2
3
/opt/seafile-backup
---- databases/ 用来存放 MySQL 容器的备份数据
---- data/ 用来存放 Seafile 容器的备份数据

要备份的数据文件:

1
2
3
/opt/seafile-data/seafile/conf # configuration files
/opt/seafile-data/seafile/seafile-data # data of seafile
/opt/seafile-data/seafile/seahub-data # data of seahub

备份数据

步骤:

备份 MySQL 数据库数据;

备份 Seafile 数据目录;

备份数据库:

1
2
3
4
5
6
7
8
9
 # 建议每次将数据库备份到一个单独的文件中。至少在一周内不要覆盖旧的数据库备份。

cd /opt/seafile-backup/databases

docker exec -it seafile-mysql mysqldump -uroot --opt ccnet_db > ccnet_db.sql

docker exec -it seafile-mysql mysqldump -uroot --opt seafile_db > seafile_db.sql

docker exec -it seafile-mysql mysqldump -uroot --opt seahub_db > seahub_db.sql

备份 Seafile 资料库数据:

直接复制整个数据目录

1
2
3
cp -R /opt/seafile-data/seafile /opt/seafile-backup/data/

cd /opt/seafile-backup/data && rm -rf ccnet

使用 rsync 执行增量备份

1
2
3
rsync -az /opt/seafile-data/seafile /opt/seafile-backup/data/

cd /opt/seafile-backup/data && rm -rf ccnet

恢复数据

恢复数据库:

1
2
3
4
5
6
7
8
9
10
11
12
docker cp /opt/seafile-backup/databases/ccnet_db.sql seafile-mysql:/tmp/ccnet_db.sql

docker cp /opt/seafile-backup/databases/seafile_db.sql seafile-mysql:/tmp/seafile_db.sql

docker cp /opt/seafile-backup/databases/seahub_db.sql seafile-mysql:/tmp/seahub_db.sql


docker exec -it seafile-mysql /bin/sh -c "mysql -uroot ccnet_db < /tmp/ccnet_db.sql"

docker exec -it seafile-mysql /bin/sh -c "mysql -uroot seafile_db < /tmp/seafile_db.sql"

docker exec -it seafile-mysql /bin/sh -c "mysql -uroot seahub_db < /tmp/seahub_db.sql"

恢复 seafile 数据:

1
cp -R /opt/seafile-backup/data/* /opt/seafile-data/seafile/

垃圾回收

在 seafile 中,当文件被删除时,组成这些文件的块数据不会立即删除,因为可能有其他文件也会引用这些块数据(用于去重功能的实现)。为了真正删除无用的块数据,还需要额外运行"GC"程序。GC 会自动检测到哪些数据块不再被任何文件所引用,并清除它们。

GC 脚本被放在 docker 容器的 /scripts 目录下。执行 GC 的方法很简单:docker exec seafile /scripts/gc.sh。对于社区版来说,该程序会暂停 Seafile 服务,但这是一个相对较快的程序,一旦程序运行完成,Seafile 服务也会自动重新启动。而专业版提供了在线运行 GC 的功能,不会暂停 Seafile 服务。

问题排查

您可以运行 docker exec 之类的 docker 命令来查找错误。

1
docker exec -it seafile /bin/bash

英文文档:https://download.seafile.com/published/seafile-manual/docker/pro-edition/Deploy%20Seafile-pro%20with%20Docker.md#user-content-For%20seafile%207.x.x

使用自定义的端口

解答:docker部署seafile修改80端口映射到主机其他端口,无法访问

问题见:https://bbs.seafile.com/t/docker-seafile-80/3195/5

但是回答的比较简单,对于刚刚入手 docker 的朋友可能不太熟悉

步骤一

修改部分已用中文标注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#以下为 docker-compose.yml 可适当修改其中的配置

seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "8088:8088" # 注意端口在这里更改,如8088,或者"8088:80"这种,nginx模板修改的少
# - "443:443" # If https is enabled, cancel the comment.
volumes:
- /opt/seafile-data:/shared
- /your/path/seafile.nginx.conf.template:/templates/seafile.nginx.conf.template:ro # 添加这个文件映射,很重要
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=db_dev # Requested, the value shuold be root's password

步骤二

步骤一中的/your/path/seafile.nginx.conf.template 文件从哪里来呢? 官方GitHub上有: 传送门

当然最稳妥的做法是进入容器内部复制一份出来,因为版本可能不一致。拷贝方法:

1
2
3
4
# 进入容器
docker exec -it seafile /bin/bash
#复制输出的内容,保存成文件
cat /templates/seafile.nginx.conf.template

步骤三

按需修改步骤二中的文件,如修改端口后:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# -*- mode: nginx -*- 本文件已经移除了https相关内容,仅为例子展示
# Auto generated at {{ current_timestr }}


server {
listen 8088; #这里修改监听端,其他基本不用修改

server_name {{ domain }};

client_max_body_size 10m;

location / {
proxy_pass http://127.0.0.1:8000/;
proxy_read_timeout 310s;
proxy_set_header Host $host;
proxy_set_header Forwarded "for=$remote_addr;proto=$scheme";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
proxy_http_version 1.1;

client_max_body_size 0;
access_log /var/log/nginx/seahub.access.log seafileformat;
error_log /var/log/nginx/seahub.error.log;
}

location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://127.0.0.1:8082;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 0;
proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
proxy_request_buffering off;
access_log /var/log/nginx/seafhttp.access.log seafileformat;
error_log /var/log/nginx/seafhttp.error.log;
}

location /seafdav {
client_max_body_size 0;
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;

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

location /media {
root /opt/seafile/seafile-server-latest/seahub;
}

# For letsencrypt
location /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}
}

步骤三-HTTPS版本

按需修改步骤二中的文件,如修改端口后:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# -*- mode: nginx -*-
# Auto generated at {{ current_timestr }}
{% if https -%}
server {
listen 80; #如果是"8088:80"这种,这里不用动
server_name _ default_server;
# allow certbot to connect to challenge location via HTTP Port 80
# otherwise renewal request will fail
location /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}

location / {
rewrite ^ https://{{ domain }}$request_uri? permanent;
}
}
{% endif -%}

server {
{% if https -%}
listen 443; #如果是"8088:443"这种,这里不用动
ssl on;
ssl_certificate /shared/ssl/{{ domain }}.crt;
ssl_certificate_key /shared/ssl/{{ domain }}.key;

ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

# TODO: More SSL security hardening: ssl_session_tickets & ssl_dhparam
# ssl_session_tickets on;
# ssl_session_ticket_key /etc/nginx/sessionticket.key;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 10m;
{% else -%}
listen 80; #如果是"8088:80"这种,这里不用动
{% endif -%}

server_name {{ domain }};

client_max_body_size 10m;

location / {
proxy_pass http://127.0.0.1:8000/;
proxy_read_timeout 310s;
{% if https -%}
proxy_set_header Host $http_host; ##改成$http_host以解决CSRF错误
{% else -%}
proxy_set_header Host $host;
{% endif -%}
proxy_set_header Forwarded "for=$remote_addr;proto=$scheme";
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
proxy_http_version 1.1;
}

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;
proxy_request_buffering off;
}

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_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS on; #我的seadav未能开启成功,原因不明
fastcgi_param HTTP_SCHEME https;

client_max_body_size 0;

proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;

send_timeout 36000s;

# This option is only available for Nginx >= 1.8.0. See more details below.

proxy_request_buffering off;

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

location /media {
root /opt/seafile/seafile-server-latest/seahub;
}

# For letsencrypt
location /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}
}

步骤四

最重要的一步,重启你的 docker,非常建议先停止容器,再重新启动。我的版本(seafile-server-7.0.5)使用 restart 并不其作用,浪费了十几分钟排查问题!!!

开启Https后的设置

1
2
3
4
5
6
7
8
# ccnet.conf
SERVICE_URL = https://域名:端口

# gunicorn.conf
bind = "localhost:8000"

# seahub_settings.py
FILE_SERVER_ROOT = "https://域名:端口/seafhttp"

WebDAV

以专业版7.0.13为例,亲测7.1.3可用,来自论坛大神:https://bbs.seafile.com/t/topic/11226

  • seafile 的conf目录下创建seafdav.conf文件,文件内容如下
1
2
3
4
5
[WEBDAV]
enabled = true
port = 8084 #自定义端口
fastcgi = false
share_name = /webdav #自定义2级目录
  • nginx server内添加如下内容
1
2
3
4
location /webdav {
proxy_pass http://127.0.0.1:8084;
index index.html index.htm;
}
  • 重启seafile 和 nginx

Seafile数据恢复

来自论坛大神,亲测有用,不要问我是怎么知道的!说多了都是泪。

https://forum.seafile.com/t/restore-from-disaster/2392/9

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
1. Setup a dummy seafile installation
#新建安装目录、下载并解压安装文件
mkdir -p $PATH/seafile-rescue
cd $PATH/seafile-rescue
wget -c https://download.seafile.com/seafhttp/files/be59287f-e77d-4c94-ac2d-5c5dcfc44325/seafile-pro-server_7.0.13_x86-64_Ubuntu.tar.gz
tar xvfz seafile-pro-server_7.0.13_x86-64_Ubuntu.tar.gz
#安装,设置两项就行,其他全默认
cd seafile pro server 7.0.13
./setup-seafile.sh
=> server name: rescue
=> server ip: 127.0.0.1
=> all other: just confirm defaults
#在新安装文件夹内建立超链接,连接到原来的seafile-data文件夹
2. link seafile-data into the new installation
cd $PATH/seafile-rescue
mv seafile-data seafile-data-dummy
ln -s /opt/mycloud/installed/seafile-data .
# 新建文件夹放置恢复的文件内容
3. Setup destination directory
mkdir $PATH2/output
# 开始恢复吧,相关命令参考官方文档
4. Extract libraries
cd $PATH/seafile-rescue/seafile-server-6.0.9
./seaf-fsck.sh -E $PATH2/output

#./seaf-fsck.sh --export ../output

Pro 7.13 安装出问题了

https://forum.seafile.com/t/error-when-starting-seafile-mc-7-1-3/11613

目前可以肯定的是不要用之前持久化的配置文件,就可以安装成功。

参考:

中文官网:https://www.seafile.com/home/

中文论坛:https://bbs.seafile.com/

英语官网:https://www.seafile.com/en/home/

https://bbs.seafile.com/t/topic/7277

https://www.cnblogs.com/bretzhao/p/11819571.html