之前公司一直用的是 seafile 来保存文档,非常好用,也出过一次大事,一个离职的员工清空电脑,然后直接把sefaile文件夹也同步清空了,好在有版本,最后找了回来。
换到新公司,财务也提了共享云盘的要求,还要求能多人同时在线编辑。
那就试着搭建 seafile + onlyoffice 了,同时要求提高安全性,在网上搜索了一圈,没几个对的,尤其是对https这一块,花了2天时间搭建,记录一下整个过程:
一、下载seafile:
没有选定高版本的,最新版本的变化太多,缺省全部都安装到 /app 目录下
wget https://download.seadrive.org/seafile-server_7.0.0_x86-64.tar.gz
tar zxvf seafile-server_7.0.0_x86-64.tar.gz
mkdir /app
mv seafile-server-7.0.0 /app
二、设定CentOS7
依然活在 CentOS 7.10 的时代,再往上升级,要升到 rokey linux 了
提醒:seafile 的安装根据版本不同,yum 装的东西也不尽然相同的,要去官方文档看
yum install python python-setuptools MySQL-python python-urllib3 python-ldap -y
三、安装MySQL数据库
这个就仁者见仁、智者见智了,我现在的方式都是二进制装,选用的是 mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz 安装的,
tar zxvf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.6.51-linux-glibc2.12-x86_64 /app
yum -y install autoconf libaio*
cat<<EOF>/etc/my.cnf
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
socket=/tmp/mysql.sock
[mysqld]
skip-name-resolve
#设置3306端口
port = 3306
socket=/tmp/mysql.sock
# 设置mysql的安装目录
basedir=/app/mysql-5.6.51-linux-glibc2.12-x86_64/
# 设置mysql数据库的数据的存放目录
datadir=/app/mysql-5.6.51-linux-glibc2.12-x86_64/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#lower_case_table_name=1
max_allowed_packet=16M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
groupadd -g mysql
useradd -g mysql mysql
# 初始化DB
cd /app/mysql-5.6.51-linux-glibc2.12-x86_64/
/app/mysql-5.6.51-linux-glibc2.12-x86_64/scripts/mysql_install_db --user=mysql
#建立 /etc/init.d/mysql 的软链接
mysql -> /app/mysql-5.6.51/support-files/mysql.server
#启动
/etc/init.d/mysql start
# 安全设置DB
cd /app/mysql-5.6.51-linux-glibc2.12-x86_64/
/app/mysql-5.6.51-linux-glibc2.12-x86_64/bin/mysql_secure_installation
四、准备onlyoffice
这里有大坑啊,其实onlyoffice的版本万万不能用最新的,因为JWT的Token认证
所以必须用低版本的,然后呢由于它其实是一组程序,调用的时候又是只用web,所以封在docker里最好
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl enable --now docker.service
#准备好证书目录
mkdir /app/onlyoffice/certs
#用lego申请好的let's encrypt免费证书或者正式证书
#只能叫这两个名字,其他不行!!!!
onlyoffice.crt
onlyoffice.key
#生成dh
cd /app/onlyoffice/certs
openssl dhparam -out dhparam.pem 2048
#跑容器
docker run -i -t -d -p 8443:443 --restart=always -v /app/onlyoffice:/var/www/onlyoffice/Data onlyoffice/documentserver:6.4.2.6
我们这里选用 onlyoffice 6.4.2.6 版本的,同时打开8443:443的端口,意味着我们准备要跑https,然后onlyoffice的证书是如上的设定方法,网上一堆胡说八道直接放开443但是无证书的,有的还要进去docker改,都不对。
五、安装seafile
这个很简单,但也很坑
cd /app/seafile-server-7.0.0/
./setup-seafile-mysql.sh
#回答问题,第一个答:
seafile
#第二个答域名,因为我们是真的用域名
seafile.rendoumi.com
#剩下选回车
这里遇到个大坑,由于我们mysql安装选择了secure的模式,所以这里会安不过去
报seafile用户无权限,没办法,用navicat,进去看用户,安装脚本给我们生成了一个用户,但是是localhost权限的,我们改成127.0.0.1,然后保存

重新安装,就可以安装成功了。
然后就是先初始化一下:
cd /app/seafile-server-latest/
./seafile.sh start
#设置管理员和密码
./seahub.sh start
然后都停掉
./seahub.sh stop
./seafile.sh stop
准备安全配置
cd /app/conf/
#vi ccnet.conf
# NAME和SERVIcE_URL就是上面安装时我们回答的2个问题
NAME = seafile
SERVICE_URL = https://seafile.rendoumi.com
#vi seafile.conf
# 增加host监听地址为127.0.0.1,稍后我们设置nginx转发,更加安全
[fileserver]
host = 127.0.0.1
port = 8082
#vi seahub_settings.py
# 增加以下各项,有onlyoffice的,有8082的
FILE_SERVER_ROOT = 'https://seafile.rendoumi.com/seafhttp'
MAX_NUMBER_OF_FILES_FOR_FILEUPLOAD = 5000
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = False
ONLYOFFICE_APIJS_URL = 'https://seafile.rendoumi.com:8443/web-apps/apps/api/documents/api.js'
ONLYOFFICE_FILE_EXTENSION = ('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'odt', 'fodt', 'odp', 'fodp', 'ods', 'fods')
ONLYOFFICE_EDIT_FILE_EXTENSION = ('docx', 'pptx', 'xlsx','doc','xls','ppt')
准备systemctl的启动文件
cat <<EOF>/etc/systemd/system/seafile.service
[Unit]
Description=Seafile Server
After=network.target mariadb.service
[Service]
Type=oneshot
ExecStart=/app/seafile-server-latest/seafile.sh start
ExecStart=/app/seafile-server-latest/seahub.sh start
ExecStop=/app/seafile-server-latest/seafile.sh stop
ExecStop=/app/seafile-server-latest/seahub.sh stop
RemainAfterExit=yes
User=root
Group=root
[Install]
WantedBy=multi-user.target
EOF
然后我们现在可以正式启动seafile了
systemctl daemon-reload
systemctl start seafile
六、安装nginx
yum -y install epel-release
yum -y install nginx
# 生成dh
cd /etc/nginx/
openssl dhparam -out dhparam.pem 2048
vi /etc/nginx/nginx.conf
#增加以下这个大段
server {
listen 80;
server_name seafile.rendoumi.com;
rewrite ^ https://$http_host$request_uri? permanent;
}
server {
listen 443 ssl;
server_name seafile.rendoumi.com;
ssl_certificate /etc/nginx/seafile.crt; #cacert.pem 文件路径
ssl_certificate_key /etc/nginx/seafile.key; #privkey.pem 文件路径
ssl_dhparam /etc/nginx/dhparam.pem;
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";
server_tokens off;
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;
access_log /var/log/nginx/seahub.access.log;
error_log /var/log/nginx/seahub.error.log;
proxy_read_timeout 1200s;
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_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 /app/seafile-server-latest/seahub; #seahub的路径
}
}
以上我们可以看到,seafile实际监听了127.0.0.1:8000和127.0.0.1:8082端口,被代理到了nginx,这样监听在本地,nginx再套上https证书,就很安全了,启动
systemctl enbale --now nginx
七、设置seafile
然后我们登录 https://seafile.rendoumi.com, 修改一下配置

确保设置正确:
SERVICE_URL设置的是 `https://seafile.rendoumi.com`
FILE_SERVER_ROOT 设置的是 `https://seafile.rendoumi.com/seafhttp`

然后就可以了,seafile就可以在线编辑了。

八、附加onlyoffice修改
我们还需要增加一点特色,给onlyoffice做一些修改:
1、自动保存
进入onlyoffice容器
docker exec -it 容器 /bin/bash
echo "Asia/Shanghai" > /etc/timezone
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date -R
nano /etc/onlyoffice/documentserver/local.json
{
"services": {
"CoAuthoring": {
// 在 CoAuthoring 中 增加 autoAssembly 属性配置
"autoAssembly": {
"enable": true,
"interval": "5m"
}, //注意这个,逗号
}
}
}
2、安装字体
字体文件放进一个zip的压缩包,其中一个目录名为office,里面是文件

然后把文件传进Linux机器中,解压
export LANG=zh_CN.UTF-8
unzip -x office.zip
cd office
ls
查看一下,务必像下面一样,是中文的

然后在office目录那一级,把字体文件拷贝进容器
docker cp office 472bf8a36f14:/usr/share/fonts/truetype/custom
进入容器
docker exec -it 472bf8a36f14 /bin/bash
# 更新字体
mkfontscale
mkfontdir
fc-cache -fv
documentserver-generate-allfonts.sh
#退出容器,重启
docker restart 472bf8a36f14
然后onlyoffice就会5分钟自动保存一下,然后多了一堆好看的中文字体:
