飘在云端

东西南北,海角天涯

· 备查 · · 448次浏览

Seafile Pro 8 在CentOS 7上的部署

demo站:https://share.0z.gs

  • 更新:2021-11-07 VPS idc cloudcone 宕机,我的vps数据丢失,demo 站暂不可用!

更新:2021-8-26 修复在线视频播放无法拖动进度条问题,增加range header转发,修复移动端H5 文件下载时断点续传失效。
更新:2021-08-24,修复webdav不支持nginx反向代理下转发的http协议,导致 MOVE 指令的移动、重命名文件等操作报 502 Bad Gateway

更新:2021-8-22 已更新到 v8.0.8 版本,修复 Office 预览问题。


另外特别说明: 我现在已经改成使用普通用户部署seafile了。root限制虽然被我使用各种办法绕过,但是强行增加部署难度,远远超出我的预期,还有将来版本seafile本身是否会对root用户部署进行限制也尚未可知,目前来看,仅仅是elasticsearch插件不允许root目录和身份运行搜索插件,seafile官方迁就搜索插件,文档改成使用普通用户部署。

前置要求:机器内存必须大于2G
安装环境:

CentOS 7.6.1810(Core)
8G ECC DDR4 
160G SSD RAID 0
6 vCPU E3-12xx 2.7 Ghz
KVM + BBR plus kernel
1 Gbps

部署用户权限:root(不建议使用,有很多限制,需要做额外操作绕过)/普通用户权限 都可以
部署目录:/root(不建议使用,很多限制,需要做额外操作绕过部署在/root目录的安全限制),
Seafile Pro 版本:seafile Pro 8.0.3(更新:已于 2021-8-22 升级到 8.0.8)

1.去 https://customer.seafile.com/downloads/ 获取最新版下载地址(需要注册登录账号)
2.安装前置依赖:

yum install python3 python3-devel python3-setuptools python3-pip poppler-utils mysql-devel gcc gc-c++ -y
pip3 install future
pip3 install mysqlclient==2.0.1

3.修复yum因安装了python3无法使用

vim /usr/bin/yum

把 第一行的 #!/usr/bin/python 修改为 #!/usr/bin/python2.7

vim /usr/libexec/urlgrabber-ext-down

第一行的 #!/usr/bin/python 也修改为 #!/usr/bin/python2.7

修改软连接指向到 python3

ln -sf /usr/bin/python3 /usr/bin/python

4.因为官方是在CentOS 8上面安装的部分依赖,在CentOS 7下面还要额外补充一些依赖,不然 python3-ldap安装不上

yum -y install openldap-devel python-devel python36-devel openldap
yum install python-ldap  gcc
pip3 install --upgrade pip
pip3 install python3-ldap

5.继续安装其他依赖

pip install boto
pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy psd-tools django-pylibmc django-simple-captcha
pip3 install pycryptodome==3.7.2

6.安装java7,先用 java -version 看看有没有安装java7,如果返回-bash: java: command not found,表示没安装

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

继续配置java环境,ls /usr/lib/jvm/查看自己的java版本,复制自己的java版本号,待会替换下面第一行的版本号为自己的,我这里是 java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64,修改配置文件导入java环境变量,vim /etc/profile,文件末尾追加三行内容:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

保存文件后,执行 source /etc/profile使修改立即生效,然后检查环境变量是否生效

echo -e $JAVA_HOME && echo -e $CLASSPATH && echo -e $PATH

7.安装宝塔面板,若不放心国内版可以考虑宝塔国际版,即AAPanel,安装宝塔面板以便快速配置nginx和mysql,机器内存大于4G 可以选mysql 8.x,nginx选择最新版就好,没什么特殊需求使用极速安装即可,小内存机器可以考虑选择mysql的分支数据库 mariadb_10.x,nginx和mysql安装完之后,复制mysql的root密码,待会用得到

8.准备开始安装,按如下结构创建目录,一级目录 seafile(或其他名字),在它的下面创建二级目录,名为 installed,这个是存放下载的安装包,
我这里把安装包下载到/root下面了,把它移到二级目录下面, mv ./seafile-pro-server_8.0.3_x86-64_CentOS.tar.gz ./seafile/installed/
`
修改以便解压,chmod +x ./installed/seafile-pro-server_8.0.3_x86-64_CentOS.tar.gz,开始解压,执行

tar zxvf /root/seafile/seafile-pro-server_8.0.3_x86-64_CentOS.tar.gz -C ../

9.启动安装交互脚本,开始安装:

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

根据自己的情况填写即可

10.cd到 seafile 代表最新版本的软连接目录,如:/root/seafile/seafile-server-latest,然后第一次启动会设置管理员用户和密码

./seafile.sh start && ./seahub.sh start

配置完之后需要重启网页端./seahub.sh restart

11.这时访问是不行的,默认配置也是仅监听本地 127.0.0.1,就是改成 0.0.0.0 也要 关闭系统自带的防火墙,因为默认状态下自带系统防火墙是在开启状态,它把8000端口给阻止了,我们需要把它给关了systemctl stop firewalld && systemctl diable firewalld,如果你是打算用seafile自带的http作为前端,并且使用非标准端口,那么到这步就好了,访问 http://你当时脚本交互中设置的域名或ip:8000。
但是一般都想要80/443访问并且配置443端口跳转,还有80/443端口复用,或者不方便直接暴露端口而是需要通过反向代理。

12.现在开始配置nginx作为seafile的前端,处理所有的http请求.
先优化一下宝塔安装的nginx主配置文件下的一些默认配置,软件商店→运行环境,点击nginx→配置修改,找到http段里面的client_max_body_size 50m; ,把它修改为 client_max_body_size 0;,表示禁用body最大发送内容限制

13.宝塔创建一个网站,纯静态类型,无需数据库和ftp,然后把自己的https证书配置上去,暂时不要开启强制HTTPS
在创建的网站的配置文件粘贴以下内容,自行替换自己的 location /media里面的seahub位置

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_set_header   X-Forwarded-Proto https;
proxy_read_timeout  86400s;
}

location /seafhttp {
        #强制响应range请求,修复在线播放视频无法拖动进度条问题
         proxy_force_ranges on;

        #转发range header转发到seafile后端,解决移动端range header 未按预期响应range导致断点续传失败。
        proxy_set_header Range $http_range;
          proxy_set_header If-Range $http_if_range;

        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        proxy_request_buffering off;
        client_max_body_size 0;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout  86400s;
        proxy_read_timeout  86400s;
        proxy_send_timeout  86400s;
        send_timeout  86400s;
    }
    location /media {
       # 自行替换自己的 location /media里面的seahub位置
         root /root/seafile/seafile-server-latest/seahub;
    }

同时找到

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires      30d;
    error_log /dev/null;
    access_log off;
}

location ~ .*\.(js|css)?$
{
    expires      12h;
    error_log /dev/null;
    access_log off; 
}

把它们全部删除,不删除宝塔默认配置的静态资源缓存,会导致seahub网页端404错误!

14.修改访问入口
修改conf文件夹下的ccnet conf文件,把SERVICE_URL = https://www.example.com修改为自己的域名/ip
继续修改conf文件夹下的seahub_settings.py,追加一行 FILE_SERVER_ROOT = 'https://www.example.com/seafhttp',同理自行替换为自己的域名或ip,注意/seafhttp不能修改,因为我们用nginx反向代理给sefile的http前端,seafhttp也在网站的配置文件中重写了,实际访问时是不用加/seafhttp的。
访问安全加固,只允许本地访问,通过nginx反向代理对外暴露80/443端口,修改seafile.conf文件,在[fileserver]下面追加一行host = 127.0.0.1

15.配置seafile服务端默认语言环境变量,修改 /etc/profile,末尾追加一行

export LC_ALL=en_US

执行 source /etc/profile 使修改立即生效,以后启动服务端的没有设置语言环境变量信息就消失了,特别提示不要手贱去改成zh_CN,除非你的系统安装了中文语言包和相关字体,不然系统会到处字体显示异常和乱码(亲自被坑体验

测试访问情况,重启服务端前的额外准备,

清空静态页面缓存

rm -rf /tmp/seahub_cache/*

修复因部署到/root路径下,导致www普通用户身份的nginx无法访问到root目录下面的静态资源,web前端界面的以/media/*路径开头的静态资源加载返回403错误。(真是蝴蝶效应...)
如果非root用户部署,或者root用户部署的服务端,但没放在/root下面的路径,而是一个可以设置成其他普通用户访问的路径,那么可以不用执行下面的命令,而是使用chown/chmod授权相关用户。

这里直接给nginx的www运行用户root权限,以便能访问root目录下的seafile安装目录

usermod -G root www

重启nginx(不能重载配置,必须重启)

重启服务端

    /root/seafile/seafile-server-latest/seafile.sh restart && /root/seafile/seafile-server-latest/seahub.sh restart

16.配置邮件发送,这里是以宝塔的自建邮局为例

修改conf配置文件夹下面的seahub_settings.py文件,末尾追加如下内容,其中一些特别说明:第一行的EMAIL_USE_SSL = True中,如果你是使用SSL(465端口)加密的邮件端口,那么不用改变,如果是使用已经标准化的TLS加密(587)端口,第一行需要改成EMAIL_USE_TLS = True ,并且后面EMAIL_PORT = '465'端口要改成587或者25

EMAIL_USE_SSL = True

EMAIL_HOST = 'xxxxx.xxxxx.xxxxx'

EMAIL_HOST_USER = 'xxxxx@xxxxxx.xxx'

EMAIL_HOST_PASSWORD = 'xxxxxxx'

EMAIL_PORT = '465'

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

SERVER_EMAIL = EMAIL_HOST_USER

配置完之后重启服务端生效 /root/seafile/seafile-server-latest/seafile.sh restart && /root/seafile/seafile-server-latest/seahub.sh restart

17.配置ElasticSearch搜索插件:
这里又是一个使用root身份部署的弊端了,ElasticSearch 5.x以后的版本再也不支持root运行,以前那些加了各种强制root运行的参数已经全部失效了,除非你去修改源码重新编译,把源码中的root检查给干掉,所以,老老实实创建个普通用户专门启动ElasticSearch插件
1>在seafile的conf配置目录下,修改seafevents.conf,修改搜索配置选项为

[INDEX FILES]
enabled = true
interval = 10m
highlight = fvh
#这个选项是改进对中文搜索的支持,实测时发现需要慎用,打开后会搜不到大量文件,先注释掉lang = chinese
external_es_server = false
es_host = 127.0.0.1
es_port = 9200
#文件的默认大小限制。大于此大小的文件将不会被索引,单位MB
office_file_size_limit = 100

经过我的踩坑测试,如果 external_es_server = true,索引的文件数量会丢失80%,大量文件无法被搜索到,没测试自己安装的低版本 ElasticSearch配合seafile是否会造成这种情况,另外seafile的自带版本仍然是万年不变的2018年10月发布的5.6.13版本,经过实测,在独自安装ElasticSearch 7.9版本时,与seafile是不兼容的。
2>创建一个普通用户,adduser elasticsearch
3>设置密码,passwd elasticsearch,因为是弱密码(与用户名相同),所以有弱密码警告,这里我是root身份,直接重复2次即可强制设定弱密码成功,如果是普通用户来设置密码,不修改密码审核策略的相关配置是无法设置弱密码
4>授权ElasticSearch搜索插件所在目录的所有者为elasticsearch

chown -R elasticsearch:elasticsearch /root/seafile/seafile-server-latest/pro/elasticsearch

因为ElasticSearch限制,不能在/root目录启动,所以我们把它复制到其他目录

cp -a /root/seafile/seafile-server-latest/pro/elasticsearch /opt

5>切换为elasticsearch这个普通用户,启动elasticsearch

su elasticsearch
nohup /opt/elasticsearch/bin/elasticsearch >/dev/null 2>&1 &

执行 ps aux |grep elasticsearch |grep -v grep,如果返回一大堆信息,说明成功了

清除索引并重建索引,先CD到/root/seafile/seafile-server-latest,执行

./pro/pro.py search --clear && ./pro/pro.py search --update

18.添加seafile服务项开机自启(普通用户),这里以普通用户为例
先让普通用户无需特权即可启动、停止服务,修改这个文件 /usr/share/polkit-1/actions/org.freedesktop.systemd1.policy

把里面的这些值改成 yes,把配置文件中的所有<defaults> 配置项里面的值内容改成 yes,注意 <defaults> 在这个配置文件中有重复好几次,全部都要改,不要漏了

<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>

保存内容,然后重启相关服务使修改生效 systemctl restart polkit,此时普通用户可以操作seafile服务了

创建seafile的后端服务,/etc/systemd/system/seafile.service

[Unit]
Description=Seafile
After=network.target mysqld.service
[Service]
Type=oneshot
ExecStart=/home/seafile/seafile/seafile-server-latest/seafile.sh start
ExecStop=/home/seafile/seafile/seafile-server-latest/seafile.sh stop
RemainAfterExit=yes
User=seafile
Group=seafile
[Install]
WantedBy=multi-user.target

注意自行修改脚本的运行用户、部署seafil的路径

接着创建seafile的前端服务seahub,vim /etc/systemd/system/seahub.service

[Unit]
Description=Seafile hub
After=network.target seafile.service
[Service]
ExecStart=/home/seafile/seafile/seafile-server-latest/seahub.sh start
ExecStop=/home/seafile/seafile/seafile-server-latest/seahub.sh stop
User=seafile
Group=seafile
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

保存之后,重载强制刷新服务列表 systemctl daemon-reload
设置开机自启systemctl enable seafile && systemctl enable seahub,启动服务 systemctl start seafile && systemctl start seahub

19.部署webdav,修改conf目录下的配置文件 seafdav.conf
把内容修改为

[WEBDAV]
enabled = true
port = 8080
share_name = /webdav
#在资料库后面显示repo_id
show_repo_id=false   

其中share_name = xxx 为你访问webdav的路径入口
如 我部署的seafile的域名是 share.0z.gs ,share_name设置为 /webdav,那么webdav访问入口就是 https://share.0z.gs/webdav(注意往下面看,需要配置反向代理暴露到443端口),随后重启seafile服务使修改生效 systemctl restart seafile

seafile pro 7.1.x之后,webdav不支持nginx反代https,移动复制重命名失败,webdav日志报大量502错误,修复方案如下:
更新:2021-8-24 ,原方案已失效放弃,已有更优解,WsgiDAV上游增加了个请求标头重写协议到http/https,且符合规范,如下这么写:

 #seafile webdav
location /webdav {
 #fix seafile webdav http → https
proxy_set_header X-Forwarded-Proto https;

proxy_pass         http://127.0.0.1:8080/webdav;
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_set_header   X-Forwarded-Proto $scheme;

#优化大文件webdav传输
proxy_read_timeout  864000s;
proxy_connect_timeout  864000s;
proxy_send_timeout  864000s;
send_timeout  864000s;
client_max_body_size 0;
proxy_request_buffering off;

}

修复前的效果:

wsgidav.wsgidav_app         INFO    :  127.0.0.1 - test@test.test - [2021-08-24 00:02:55] "MOVE /TEMP/test.txt" dest="http://share.0z.gs/webdav/TEMP/test/test.txt", length=0, depth=0, overwrite=T, elap=0.068sec -> 502 Bad Gateway

修复后效果,返回204状态码响应(无内容变化):

wsgidav.wsgidav_app         INFO    :  127.0.0.1 - test@test.test - [2021-08-24 00:07:25] "MOVE /TEMP/test2.txt" dest="https://share.0z.gs/webdav/TEMP/test/test2.txt", length=0, depth=0, overwrite=T, elap=0.155sec -> 204 No Content


20.部署Libreoffice 7.1.x 版本(等待后续内容更新,暂时到这了,demo站已经部署office预览,偷个懒摸鱼)

相关信参考息:
seafile基于WsgiDAV上游的变动

https://github.com/mar10/wsgidav/commit/2fb3a426d4669013342bd9e7b3f0bf804ad36bac
https://github.com/mar10/wsgidav/issues/183
https://forum.seafile.com/t/seafdav-move-command-causing-502/11582/22

评论 (0条)