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