ubuntu 20 部署Seafile 8.0.3个人网盘过程记录

写在前面

这只是一个基于官方手册的流水帐式记录,目的不是提供一个攻略,并且也不保证其他人能成功部署。

个人一点不负责的总结&感想:Seafile这个网盘解决方案,可以分为两个部分,seafile和seahub,网盘的各种功能实现在前者,后者应该仅仅用作提供一个web界面。seafile的后端是用C语言写的,所以效率很好(看网上风评应该是碾压nextcloud);而seafile暴露出来的网络交互接口应该是用Python3写的,seahub的web服务器应该也是用的Python3,不然为啥这么多地方需要Python。

大致步骤如下:

  • 准备环境
  • 下载Seafile服务端
  • 安装python3的各种包
  • 安装MySQL(mariadb)
  • 安装Seafile
  • 启动Seafile
  • 配置Nginx反向代理
  • 设置上传下载文件的URL
  • 启用HTTPS(可选)

看上去很复杂,其实每一步都挺容易的。

准备环境

我用的是Ubuntu 20,不过看官方手册应该别的版本或别的发行版也可以。准备好服务器资源后,看能否ssh它,后续全部在服务器的操作都是用远程shell操作。

下载Seafile服务端

先ssh服务器,然后身份切为root

sudo -i

本地浏览器打开Seafile下载页面,找到想要的版本的下载链接,这里以8.0.3为例子。复制下载链接,回到ssh,新建Seafile目录,然后下载到这里

mkdir /opt/seafile
cd /opt/seafile
wget https://seafile-downloads.oss-cn-shanghai.aliyuncs.com/seafile-server_8.0.3_x86-64.tar.gz

然后解压,并保留原始压缩包(暂时不是很清楚保留这个压缩包有什么用,但是手册上是这么写的,那就照做吧)

tar -xzf seafile-server_8.0.3_x86-64.tar.gz
mkdir installed
mv seafile-server_8.0.3_x86-64.tar.gz installed/

现在目录结构应该差不多长这样

root@VM-8-3-ubuntu:/opt/seafile# tree -L 2
.
├── installed
│   └── seafile-server_8.0.3_x86-64.tar.gz
└── seafile-server-8.0.3
    ├── check_init_admin.py
    ├── reset-admin.sh
    ├── runtime
    ├── seaf-fsck.sh
    ├── seaf-fuse.sh
    ├── seaf-gc.sh
    ├── seafile
    ├── seafile.sh
    ├── seahub
    ├── seahub.sh
    ├── setup-seafile-mysql.py
    ├── setup-seafile-mysql.sh
    ├── setup-seafile.sh
    ├── sql
    └── upgrade

7 directories, 11 files

安装python3的各种包

不是python专业用户,所以不是很懂每个包是拿来干嘛的,问题不大。

这里把手册里需要的包分开两部分安装,因为第一部分可以直接install成功,第二部分的包需要系统先安装memcached(一个高速缓存解决方案,估计是用来加速seafile的处理效率的 )和sqlclient。那么先安装第一部分

pip3 install Pillow captcha jinja2 sqlalchemy psd-tools django-simple-captcha future

OK,应该没有任何报错就搞掂了第一部分。接下来是第二部分,首先给系统安装memcached和mysqlclient,然后再安装第二部分Python包

apt update
apt install memcached
apt install libmemcached-dev
apt install libmysqlclient-dev

pip3 install pylibmc django-pylibmc mysqlclient

这样以来,应该所有的Python3包就安装完毕,进入下一步。

安装MySQL(mariadb)

数据库应该是用来保存用户信息之类的吧,因为Seafile也是有用户帐号系统的。首先一句话安装MySQL

apt install mariadb-server

MariaDB会带下来一个secure installation脚本,执行它

mysql_secure_installation

跟着提示走就行了,我这里全部回答都保持了默认的回答,轻轻松松配置完毕。注意设置的Root password需要牢记。

安装Seafile

官方已经有一个安装脚本了,只需运行它即可。脚本会提示你输入一些预设参数(比如你的服务器ip等),按照喜欢的输入就好。这里保持了seafile fileserver端口为默认的8082。

cd seafile-server-8.0.3/
./setup-seafile-mysql.sh

一顿操作之后,可以看到脚本在正式执行安装前会把你的设置展示一遍,给你一个反悔的机会(下面我把域名给码了)。

---------------------------------
This is your configuration
---------------------------------

    server name:            seafile
    server ip/domain:       mydomain.com

    seafile data dir:       /opt/seafile/seafile-data
    fileserver port:        8082

    database:               create new
    ccnet database:         ccnet-db
    seafile database:       seafile-db
    seahub database:        seahub-db
    database user:          seafile



---------------------------------
Press ENTER to continue, or Ctrl-C to abort
---------------------------------

回车之后,马上就可以看见安装成功提示:

-----------------------------------------------------------------
Your seafile server configuration has been finished successfully.
-----------------------------------------------------------------

run seafile server:     ./seafile.sh { start | stop | restart }
run seahub  server:     ./seahub.sh  { start <port> | stop | restart <port> }

-----------------------------------------------------------------
If you are behind a firewall, remember to allow input/output of these tcp ports:
-----------------------------------------------------------------

port of seafile fileserver:   8082
port of seahub:               8000

When problems occur, Refer to

        https://download.seafile.com/published/seafile-manual/home.md

for information.

现在的目录组织应该长这样

root@VM-8-3-ubuntu:/opt/seafile# tree -L 2
.
├── ccnet
├── conf
│   ├── ccnet.conf
│   ├── gunicorn.conf.py
│   ├── seafdav.conf
│   ├── seafile.conf
│   └── seahub_settings.py
├── installed
│   └── seafile-server_8.0.3_x86-64.tar.gz
├── seafile-data
│   └── library-template
├── seafile-server-8.0.3
│   ├── check_init_admin.py
│   ├── reset-admin.sh
│   ├── runtime
│   ├── seaf-fsck.sh
│   ├── seaf-fuse.sh
│   ├── seaf-gc.sh
│   ├── seafile
│   ├── seafile.sh
│   ├── seahub
│   ├── seahub.sh
│   ├── setup-seafile-mysql.py
│   ├── setup-seafile-mysql.sh
│   ├── setup-seafile.sh
│   ├── sql
│   └── upgrade
├── seafile-server-latest -> seafile-server-8.0.3
└── seahub-data
    └── avatars

14 directories, 16 files

启动Seafile

seafile-server-latest是一个软链接,指向了最新版seafile目录,这个软链接应该是为了后续升级时方便处理用的,先不纠结,反正这里只有一个刚刚安装的8.0.3版本。

cd到这个目录,先启动seafile。

root@VM-8-3-ubuntu:/opt/seafile/seafile-server-latest# ./seafile.sh start

Starting seafile server, please wait ...
** Message: 19:02:49.055: seafile-controller.c(535): No seafevents.

Seafile server started

Done.

启动成功!然后再启动seahub,前面说过这是一个有用户帐号系统的网盘,既然如此当然要有一个管理员,第一次启动seahub需要设置管理员帐号密码(下面我码掉了我的个人Email地址)。

root@VM-8-3-ubuntu:/opt/seafile/seafile-server-latest# ./seahub.sh start

LC_ALL is not set in ENV, set to en_US.UTF-8
Starting seahub at port 8000 ...

----------------------------------------
It‘s the first time you start the seafile server. Now let‘s create the admin account
----------------------------------------

What is the email for the admin account?
[ admin email ] myemail@example.com

What is the password for the admin account?
[ admin password ] 

Enter the password again:
[ admin password again ] 



----------------------------------------
Successfully created seafile admin
----------------------------------------




Seahub is started

Done.

注意,seahub是监听在localhost:8000上的,所以不能本地浏览器直接输入mydomain.com:8000访问,所以要继续下一步。

配置Nginx反向代理

这一步开始,就需要用到本地浏览器了。先把我自己之前踩过的坑写在最前面:修改nginx配置后(比如改端口、http换https等),有时本地浏览器访问网站却看不出修改后的效果,这是因为本地浏览器有缓存,发生这个问题时可以尝试清除浏览器本地缓存。

回到主题,首先安装Nginx。

apt install nginx

然后cd到 /etc/nginx/sites-available/ 这个目录下,这个目录保存的是网站的配置文件。在这个目录下新建一个文本文件seafile.conf,内容如下

server {
    listen 80;
    server_name mydomain.com;
    proxy_set_header X-Forwarded-For $remote_addr;

    location / {
         proxy_pass         http://127.0.0.1:8000;
         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_set_header   X-Forwarded-Host $server_name;
         proxy_read_timeout  1200s;

         # used for view/edit office file via Office Online Server
         client_max_body_size 0;

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

# If you are using [FastCGI](http://en.wikipedia.org/wiki/FastCGI),
# which is not recommended, you should use the following config for location `/`.
#
#    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;
#         fastcgi_read_timeout 36000;
#
#         client_max_body_size 0;
#
#         access_log      /var/log/nginx/seahub.access.log;
#         error_log       /var/log/nginx/seahub.error.log;
#    }

    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        client_max_body_size 0;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout  36000s;
        proxy_read_timeout  36000s;
        proxy_send_timeout  36000s;
        send_timeout  36000s;
    }

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

}

然后cd到 ../sites-enabled/ 目录,删除原有的default,再创建软链接,链接到刚刚那个文件上

root@VM-8-3-ubuntu:/etc/nginx/sites-enabled# ls
default
root@VM-8-3-ubuntu:/etc/nginx/sites-enabled# rm default 
root@VM-8-3-ubuntu:/etc/nginx/sites-enabled# ln -s ../sites-available/seafile.conf seafile.conf
root@VM-8-3-ubuntu:/etc/nginx/sites-enabled# ls
seafile.conf

这里要注意一下,上面的nginx配置了监听80端口,这个端口一般防火墙都会默认通过的。如果监听了别的端口,

然后,重启nginx以使得更新生效

systemctl restart nginx

此时,本地浏览器输入 mydomain.com,就能看到登陆界面了。

ubuntu 20 部署Seafile 8.0.3个人网盘过程记录

输入刚刚配置的seahub管理员帐号密码,即可登陆,看到主页。

ubuntu 20 部署Seafile 8.0.3个人网盘过程记录

设置上传下载文件的URL

点右上角头像,点“系统管理”,左边一栏去到“设置”。把SERVICE_URL改为http://mydomain.com/,FILE_SERVER_ROOT改为http://mydomain.com/seafhttp。如果你的nginx不监听80端口就把端口号也加上。

修改完之后,点右上角头像,“退出系统管理”,即可回到主页。

至此,一个网盘已经搭建好。面向用户的客户端网盘用法应该参阅官方客户端手册(其实不用参阅也行,界面还是很清晰的,稍微点一点琢磨一下就知道用法了)。

启用HTTPS(可选)

事实上到刚刚那一步已经可以用网盘了,但是安全性不够,有被中间人监听的风险。因此想折腾启用HTTPS的话可以进行这一步。

申请SSL证书的过程就不写了,当然也可以用自颁发证书,不过这样子的话,就算自己电脑添加了信任,在别的电脑上打开网站就会被浏览器提示证书有问题。

这里假定服务器上已经有证书文件了(如果证书文件在本地,可以scp上去),我的证书保存在 /etc/ssl/1_mydomain.com_bundle.crt,私钥存在 /etc/ssl/2_mydomain.com.key

修改nginx的配置文件 /etc/nginx/sites-available/seafile.conf,改为如下,注意这里监听的是8888端口,而不是443端口,因为很久以前我监听了443,然后过了几天一打开网站就被提醒说没有备案。之后换了一个非标准端口,就没问题了。记得配置防火墙允许8888端口流量进入。

server {
    listen 80;
    server_name mydomain.com;
    rewrite ^ https://$http_host:8888$request_uri? permanent;    # force redirect http to https
}

server {
    listen 8888 ssl;
    server_name mydomain.com;
    ssl_certificate /etc/ssl/1_mydomain.com_bundle.crt;
    ssl_certificate_key /etc/ssl/2_mydomain.com.key;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ‘ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS‘;
    ssl_prefer_server_ciphers on;

    proxy_set_header X-Forwarded-For $remote_addr;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
         proxy_pass         http://127.0.0.1:8000;
         proxy_set_header   Host $host:8888;
         proxy_set_header   X-Real-IP $remote_addr;
         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header   X-Forwarded-Host $server_name;
	 proxy_set_header   X-Forwarded-Proto https;
         proxy_read_timeout  1200s;

         # used for view/edit office file via Office Online Server
         client_max_body_size 0;

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

# If you are using [FastCGI](http://en.wikipedia.org/wiki/FastCGI),
# which is not recommended, you should use the following config for location `/`.
#
#    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;
#         fastcgi_read_timeout 36000;
#
#         client_max_body_size 0;
#
#         access_log      /var/log/nginx/seahub.access.log;
#         error_log       /var/log/nginx/seahub.error.log;
#    }

    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        client_max_body_size 0;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout  36000s;
        proxy_read_timeout  36000s;
        proxy_send_timeout  36000s;
        send_timeout  36000s;
    }

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

}

然后重启nginx即可

systemctl restart nginx

由于配置了重定向,浏览器输入 mydomain.com 或 https://mydomain.com:8888 都可以正常使用。

最后,记得按照之前说的步骤,去系统管理里 ,改一下SERVICE_URL和FILE_SERVER_ROOT。

至此,网盘搭建完毕。后续还有一些可选操作(比如配置开机自启动),以后再补充吧。

ubuntu 20 部署Seafile 8.0.3个人网盘过程记录

上一篇:Linux系统编程【3.1】——编写ls命令


下一篇:【2021.02.07】macOS的pytorch环境安装与配置