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用户和用户组指南。

升级系统:

apt update && apt upgrade

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

adduser sfadmin
adduser sfadmin sudo

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

exit
ssh sfadmin@<your_linode's_ip>

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

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

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

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

sudo ufw status numbered

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

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

sudo hostnamectl set-hostname seafile

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

127.0.1.1    members.linode.com     seafile

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

sudo dpkg-reconfigure tzdata

安装并配置MySQL

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

sudo apt install mysql-server-5.7

运行 mysql_secure_installation 脚本:

sudo mysql_secure_installation

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

创建可供Nginx使用的TLS证书

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

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

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

安装并配置Nginx

通过Ubuntu的软件库安装Nginx:

sudo apt install nginx

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

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

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

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

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

sudo nginx -t
sudo systemctl restart nginx

安装并配置Seafile

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

mkdir ~/sfroot && cd ~/sfroot

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

wget <link>

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

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

安装Seafile的依赖包:

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

运行安装脚本:

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

启动服务端程序。

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

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

运行seahub.sh
运行seahub.sh

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

登录Seafile
登录Seafile

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

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

创建systemd单元文件:

/etc/systemd/system/seafile.service

[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

[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

之后启动服务:

sudo systemctl enable seafile
sudo systemctl enable seahub

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

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手册