Seafile是一个跨平台的文件托管工具,包含了适用于Linux和Windows的服务器应用程序,以及适用于Android,iOS,Linux,OS X和Windows的GUI客户端。它支持文件版本控制和快照,双重身份验证,WebDAV(Web-based Distributed Authoring and Versioning),并且可以配合Nginx和Apache使用以启用HTTPS。
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的管理员用户账户。系统会要求您输入登录用的电子邮件账户并创建密码。
现在可以通过您Linode服务器的IP地址,或是之前在Nginx的seafile.conf
配置文件中设置的server_name
,在Web浏览器中访问Seafile。如之前所说,Nginx将重定向至HTTPS连接,由于您创建了自签名证书,因此您的浏览器将警告该HTTPS连接不是私有的。忽略浏览器警告并继续访问该网址,您将看到Seafile的登录界面。
设置Seafile在服务器启动时自启动
seafile.sh
与seahub.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手册以了解最适合您需求的升级说明。
参考文章