之前公司一直用的是 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,然后保存

image-20230115095218351

重新安装,就可以安装成功了。

然后就是先初始化一下:

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, 修改一下配置

image-20230115100916889

确保设置正确:

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

image-20230115101114820

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

image-20230115101556884

八、附加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,里面是文件

image-20230115102214136

然后把文件传进Linux机器中,解压

export LANG=zh_CN.UTF-8
unzip -x office.zip
cd office
ls

查看一下,务必像下面一样,是中文的

image-20230115102332499

然后在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分钟自动保存一下,然后多了一堆好看的中文字体:

image-20230115102734534