Seafile是一个跨平台的文件托管工具,包含了适用于Linux和Windows的服务器应用程序,以及适用于Android,iOS,Linux,OS X和Windows的GUI客户端。它支持文件版本控制和快照,双重身份验证,WebDAV(Web-based Distributed Authoring and Versioning),并且可以配合Nginx和Apache使用以启用HTTPS。

在Ubuntu 16.04上安装Seafile并配置Nginx
在Ubuntu 16.04上安装Seafile并配置Nginx

Seafile有两个版本:免费的开源社区版和付费的专业版。虽然专业版最多可供3位用户免费使用,本教程还是将使用Seafile的社区版本,使用Nginx作为服务器提供HTTPS连接,后端使用MySQL数据库。

准备Ubuntu环境

注意

本指南是为非root用户编写的,会在需要提升权限的命令之前加上sudo。如果您不熟悉sudo命令,请参阅Linux用户和用户组指南。

升级系统:

1
apt update && apt upgrade

使用root权限创建标准用户账户。本例中,我们将创建一个名为 sfadmin 的用户:

1
2
adduser sfadmin
adduser sfadmin sudo

注销您已登录Linode的root账户,然后以 sfadmin 的身份重新登录:

1
2
exit
ssh sfadmin@<your_linode's_ip>

现在您应该已经以 sfadmin 的身份登录到您的Linode服务器。请参考保护您的服务器安全指南以提高SSH访问的安全性。

设置UFW防火墙规则。UFW是Ubuntu的防火墙控制器,它让设置防火墙规则变得更加简单。有关UFW的更多信息,请参阅使用UFW配置防火墙指南。使用以下命令允许SSH和HTTP(S)通过防火墙:

1
2
3
4
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

之后检查防火墙规则的状态,并以标号列表的形式列出:

1
sudo ufw status numbered

输出应与下面的示例相似:

1
2
3
4
5
6
7
8
9
10
Status: active

To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 80 ALLOW IN Anywhere
[ 3] 443 ALLOW IN Anywhere
[ 4] 22 (v6) ALLOW IN Anywhere (v6)
[ 5] 80 (v6) ALLOW IN Anywhere (v6)
[ 6] 443 (v6) ALLOW IN Anywhere (v6)

注意

如果不希望UFW在22端口上允许来自IPv4与IPv6的SSH连接,您可以删除对应的规则。例如,您可以运行sudo ufw delete 4命令来删除允许来自IPv6的SSH连接通过的规则。

设置Linode主机名,这里我们设置为 seafile

1
sudo hostnamectl set-hostname seafile

/etc/hosts中添加新主机名。该文件的第二行应该类似下面的示例:

1
127.0.1.1    members.linode.com     seafile

首次启动时,您的Linode服务器时区会被设置为UTC(Coordinated Universal Time,世界协调时间)。更改时区是可选项,如果您希望这么做,请运行以下命令:

1
sudo dpkg-reconfigure tzdata

安装并配置MySQL

安装程序将要求您为MySQL的root用户设置密码。请确保您安装的是mysql-server-5.7,而不是mysql-server。这是因为如果您通过mysql-server包安装MySQL,一个来自上游的问题将导致MySQL服务在启动时出现错误。

1
sudo apt install mysql-server-5.7

运行 mysql_secure_installation 脚本:

1
sudo mysql_secure_installation

有关MySQL的更多信息,请参阅在Ubuntu上安装MySQL指南。

创建可供Nginx使用的TLS证书

如果您还没有SSL/TLS证书,可以现在创建一个。这是一个自签名证书,并让Web浏览器拒绝未经认证的连接。您应该验证浏览器证书的SHA256指纹与服务器证书的SHA256指纹是否相同,并在浏览器中添加例外以永久信任该证书。

切换到证书文件存储的路径,并使用密钥创建服务器证书:

1
2
3
cd /etc/ssl
sudo openssl genrsa -out privkey.pem 4096
sudo openssl req -new -x509 -key privkey.pem -out cacert.pem

安装并配置Nginx

通过Ubuntu的软件库安装Nginx:

1
sudo apt install nginx

创建站点配置文件。您唯一需要修改的一行是server_name。有关HTTPS的更多配置选项,请参阅Nginx的TLS最佳实践指南。

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
server{
listen 80;
server_name example.com;
rewrite ^ https://$http_host$request_uri? permanent;
proxy_set_header X-Forwarded-For $remote_addr;
}
server {
listen 443 ssl http2;
ssl on;
ssl_certificate /etc/ssl/cacert.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
server_name example.com;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
ssl_session_cache shared:SSL:10m;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH !RC4";
ssl_prefer_server_ciphers on;

fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;

location / {
fastcgi_pass 127.0.0.1:8000;
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;
fastcgi_param REMOTE_ADDR $remote_addr;

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

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_send_timeout 36000s;
send_timeout 36000s;
proxy_request_buffering off;
}

location /media {
root /home/sfadmin/sfroot/seafile-server-latest/seahub;
}
}

禁用默认的站点配置并启用刚刚创建的站点配置:

1
2
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/seafile.conf /etc/nginx/sites-enabled/seafile.conf

运行Nginx配置测试并重启Web服务器。如果测试失败,终端会显示简要的错误描述信息,以便您能借此解决问题。

1
2
sudo nginx -t
sudo systemctl restart nginx

安装并配置Seafile

Seafile手册建议使用特定的目录结构来简化日后的升级过程。在这里我们也会这样做,只不过我们把在sfadmin家目录下创建的目录命名为sfroot,而不是Seafile手册示例中的haiwen

1
mkdir ~/sfroot && cd ~/sfroot

下载Seafile CE Linux服务端安装文件的64位版本。您需要从Seafile官网获取对应的下载链接。取得下载URL后,使用wget命令将其下载至~/sfadmin/sfroot

1
wget <link>

解压tarball,并将压缩包移动到installed目录:

1
2
tar -xzvf seafile-server*.tar.gz
mkdir installed && mv seafile-server*.tar.gz installed

安装Seafile的依赖包:

1
sudo apt install python2.7 libpython2.7 python-setuptools python-imaging python-ldap python-mysqldb python-memcache python-urllib3

运行安装脚本:

1
cd seafile-server-* && ./setup-seafile-mysql.sh

启动服务端程序。

1
2
./seafile.sh start
./seahub.sh start-fastcgi

seahub.sh脚本将创建用于登录Seafile的管理员用户账户。系统会要求您输入登录用的电子邮件账户并创建密码。

现在可以通过您Linode服务器的IP地址,或是之前在Nginx的seafile.conf配置文件中设置的server_name,在Web浏览器中访问Seafile。如之前所说,Nginx将重定向至HTTPS连接,由于您创建了自签名证书,因此您的浏览器将警告该HTTPS连接不是私有的。忽略浏览器警告并继续访问该网址,您将看到Seafile的登陆界面。

设置Seafile在服务器启动时自启动

seafile.shseahub.sh脚本并不会自动在您的Linode服务器重启后运行,需要我们手动进行设置。

创建systemd单元文件:

/etc/systemd/system/seafile.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Seafile Server
After=network.target mysql.service

[Service]
Type=oneshot
ExecStart=/home/sfadmin/sfroot/seafile-server-latest/seafile.sh start
ExecStop=/home/sfadmin/sfroot/seafile-server-latest/seafile.sh stop
RemainAfterExit=yes
User=sfadmin
Group=sfadmin

[Install]
WantedBy=multi-user.target

/etc/systemd/system/seahub.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Seafile Hub
After=network.target seafile.service

[Service]
Type=oneshot
ExecStart=/home/sfadmin/sfroot/seafile-server-latest/seahub.sh start-fastcgi
ExecStop=/home/sfadmin/sfroot/seafile-server-latest/seahub.sh stop
RemainAfterExit=yes
User=sfadmin
Group=sfadmin

[Install]
WantedBy=multi-user.target

之后启动服务:

1
2
sudo systemctl enable seafile
sudo systemctl enable seahub

您可以使用以下命令验证服务是否成功启动:

1
2
sudo systemctl status seafile
sudo systemctl status seahub

重新启动Linode服务器验证自启动脚本是否生效。服务器启动后,当运行上一步中的验证命令时,Seafile和Seahub都应处于活跃状态。同样的,此时您应该也可以在浏览器中访问Seafile服务。

升级Seafile

有多种方法可供您升级Seafile。请参阅Seafile手册以了解最适合您需求的升级说明。

参考文章

  1. Install Seafile with NGINX on Ubuntu 16.04 | Linode
  2. 在Ubuntu 16.04上安装Seafile并配置Nginx | 腾讯云+社区
  3. Seafile Server手册