基于 Docker 部署 SeafilePro + OnlyOffice(CentOS版)


#1

CentOS 服务器 基于 Docker 部署 SeafilePro + OnlyOffice ,开启自定义域名和 https 的详细教程。

地址一

地址二

前言

本教程完全基于Seafile官方文档进行安装部署的完全操作(傻瓜式)指南。

官方文档

1.Seafile 官方文档-用Docker部署Seafile

2.Seafile 官方文档-OnlyOffice 集成

滚蛋吧2020,熬过了艰难的一年,2021为了让自己牛气冲天,所以新组装了一台NAS服务器,正在部署 ALL IN ONE

已经平稳运行了4年的 Seafile 专业版也就顺理成章的迁移过来了。官方推荐使用 Docker 部署 Seafile,所以我也就欣然采纳,实际部署起来确实比单独服务部署要方便快捷很多。

下面开始教程,服务器基于 CentOS7.X

一、安装 Seafile Pro

1. 安装 docker

因为 Seafile v7.x.x 容器是通过 docker-compose 命令运行的,所以首先要安装Docker。

# 安装 Docker
yum -y install docker
# 启动 Docker
systemctl start docker
# 设置 Docker开机自启动
systemctl enable docker

#-----------------------------其它 Docker常用命令-----------------------------
# 查看版本号
docker -v
# 查看 Docker 状态,报错时候使用
systemctl status docker
# 停止 Docker
systemctl stop docker
# 重启 Docker 
systemctl restart docker 
# 查看正在运行的容器
docker ps 
# 查看所有容器,包括停止的容器
docker ps -a
# 查看容器占用资源情况
docker stats
# 查看容器的日志(可在这查看报错信息)
docker logs 容器名或ID
# 启动已被停止的容器
docker start 容器名或ID
# 停止运行中的容器
docker stop 容器名或ID
# 重启容器
docker restart 容器名或ID

2. 安装 docker-compose

官方是通过docker-compose管理seafileseafile-elasticsearchseafile-memcachedseafile-mysql四个容器。

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

通过 pip 安装 docker-compose ,也可参考 CentOS 7.x 安装 Docker-Compose

# 添加企业版附加包
yum -y install epel-release
# 安装pip
yum -y install python-pip
# 更新pip
pip install --upgrade pip
# 安装docker-compose
pip install docker-compose

# 查看docker compose的版本
docker-compose version

3. 下载并修改 docker-compose.yml

引用 Seafile 官方文档:

下载 docker-compose.yml 示例文件到您的服务器上,然后根据您的实际环境修改该文件。尤其是以下几项配置:

  • MySQL root 用户的密码 (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)
  • 持久化存储 MySQL 数据的 volumes 目录 (volumes)
  • 持久化存储 Seafile 数据的 volumes 目录 (volumes)
  • 持久化存储 Elasticsearch 索引数据的 volumes 目录 (volumes)

下载docker-compose.yml到本地,然后修改完成后上传到服务器/opt目录。

需要修改的配置有:

  1. 设置 mysql 的 root 密码
  2. Seafile 中需要填写第一步设置的 mysql 密码
  3. 设置 Seafile 管理员账号邮箱
  4. 设置 Seafile 管理员账号密码
  5. 开启 https 443 端口
  6. 设置 https 域名
version: '2.0'
services:
  db:
    image: mariadb:10.1
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=mysql-root-password  # 1. 设置MySQL的root密码
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /opt/seafile-mysql/db:/var/lib/mysql  # 指定MySQL数据持久存储的路径,默认即可不用修改。
    networks:
      - seafile-net

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    entrypoint: memcached -m 256
    networks:
      - seafile-net

  elasticsearch:
    image: seafileltd/elasticsearch-with-ik:5.6.16
    container_name: seafile-elasticsearch
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 2g
    volumes:
      - /opt/seafile-elasticsearch/data:/usr/share/elasticsearch/data  # 指定Elasticsearch数据持久存储的路径,默认即可不用修改。
    networks:
      - seafile-net
          
  seafile:
    image: docker.seafile.top/seafileltd/seafile-pro-mc:latest
    container_name: seafile
    ports:
      - "80:80"
      - "443:443"  # 5.开启 https 
    volumes:
      - /opt/seafile-data:/shared   # 指定Seafile数据持久存储的路径,默认即可不用修改。
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=mysql-root-password  # 2. 上面配置的 mysql root 密码
#      - TIME_ZONE=Asia/Shanghai # 默认为UTC。需要修改时区时设置,一般不需要设置。
      - SEAFILE_ADMIN_EMAIL=me@example.com # 3. 设置 Seafile 管理员账号邮箱
      - SEAFILE_ADMIN_PASSWORD=asecret    # 4. 设置 Seafile 管理员账号密码
      - SEAFILE_SERVER_LETSENCRYPT=false   # 使用 Let's encrypt SSL 证书开启,使用自己的证书不用开启
      - SEAFILE_SERVER_HOSTNAME=example.seafile.com # 6. 开启 https 后填写你的域名
    depends_on:
      - db
      - memcached
      - elasticsearch
    networks:
      - seafile-net

networks:
  seafile-net:

4. 启动 Seafile 服务

必须在 docker-compose.yml 文件所在目录进行启动。

cd /opt
# 启动 seafile
docker-compose up -d

首次启动需要等待几分钟,容器首次启动时会初始化所有服务。

5. 配置 Seafile https ssl 证书

  1. 服务初始化完成后,需要上传自己的 ssl 证书。
# 创建 ssl 目录,然后将证书上传到该目录
mkdir /opt/seafile-data/ssl
  1. 修改 Nginx 的配置文件,配置ssl。
vim /opt/seafile-data/nginx/conf/seafile.nginx.conf

​ ssl 配置如下:

server {
	listen 443;
    server_name example.seafile.com; # 你的域名
    
    ssl on;
    ssl_certificate /shared/ssl/你的证书.pem;        #pem 文件路径
    ssl_certificate_key /shared/ssl/你的证书.key;    #pem 文件路径
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
	ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    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;
    # 注释掉80端口自动转发到443端口,添加一句'error_page 497 301 https://$http_host$request_uri;',这样就可以实现http自动跳转到https了。
    error_page 497 301 =307 https://v.itmm.wang:6443$request_uri;
    
    ... 后面的内容保持不变
    location / {        
       ... 
    }
    ...
}

​ 配置完成后重启nginx

# 配置完成后重启nginx
docker exec -it seafile /usr/sbin/nginx -s reload

6. 防火墙放行端口

# 开放端口
firewall-cmd --zone=public --add-port=443/tcp --permanent
# 顺便把 OnlyOffice 用到的两个端口也开放,后面就不用再开了
firewall-cmd --zone=public --add-port=8088/tcp --permanent
firewall-cmd --zone=public --add-port=8443/tcp --permanent
# 重载防火墙
firewall-cmd --reload

这时候应该可以通过你的域名https://example.seafile.com访问Seafile主页了。

如果你的域名没有备案的话是无法访问443端口的,需要在路由器里配置端口转发到443(前提是得有公网IP和DDNS)。

配置完端口转发后还需要在Seafile系统管理中配置一下端口。

7. 配置 docker-compose 开机自启动

# 配置 docker-compose 开机自启动
vim /etc/rc.d/rc.local
# 文件后面添加下行内容,注意docker-compose.yml目录
docker-compose -f /opt/docker-compose.yml up -d
# 保存退出后,为 rc.local 文件添加执行权限
chmod +x /etc/rc.d/rc.local

至此 Seafile 专业版安装完成,下面开始安装 OnlyOffice。

二、安装 OnlyOffice

OnlyOffice 官方号称完美替代 LibreOffice,100%兼容微软三件套(Microsoft Word、Excel 和 PowerPoint)。

Seafile建议完全按照 OnlyOffice 官方文档部署即可,没错我也是这么干的,但是在 ssl 配置上折腾了大半天,所以我还是再啰嗦一遍。

再次附上 OnlyOffice 官方文档 Docker-DocumentServer

1. docker 拉取 onlyoffice 镜像

 # 拉取 onlyoffice 镜像
 docker pull onlyoffice/documentserver

2. 创建目录映射 docker 容器内的目录

 # 创建几个目录 用于 onlyoffice 的数据卷
 cd /opt
 # 建议与 seafile 容器都放在 /opt 目录方便管理
 mkdir seafile-onlyoffice
 cd seafile-onlyoffice
 mkdir log
 mkdir data
 mkdir lib
 mkdir db

3. 启动 OnlyOffice 容器

# 启动onlyoffice镜像(绑定 http 8088 端口和 https 8443 端口)# 8080端口目前也被封了,所以这里用8088,不为别的就是图个吉利
docker run -i -t -d -p 8088:80 -p 8443:443 --name onlyoffice --restart=always /
-v /opt/seafile-onlyoffice/log:/var/log/onlyoffice /
-v /opt/seafile-onlyoffice/data:/var/www/onlyoffice/Data /
-v /opt/seafile-onlyoffice/lib:/var/lib/onlyoffice /
-v /opt/seafile-onlyoffice/db:/var/lib/postgresql onlyoffice/documentserver

# 当然这样一行直接运行镜像也是可以的
docker run -i -t -d -p 8088:80 -p 8443:443 --name onlyoffice --restart=always -v /opt/seafile-onlyoffice/log:/var/log/onlyoffice -v /opt/seafile-onlyoffice/data:/var/www/onlyoffice/Data -v /opt/seafile-onlyoffice/lib:/var/lib/onlyoffice -v /opt/seafile-onlyoffice/db:/var/lib/postgresql onlyoffice/documentserver

前面如果已经对防火墙端口放行了的话,这时候通过ip+端口应该就可以访问到了。

4. 配置 OnlyOffice https ssl 证书

# 复制 onlyoffice容器中的 nginx 配置文件 ds.conf 到主机
docker cp onlyoffice:/etc/onlyoffice/documentserver/nginx/ds.conf /opt/seafile-onlyoffice/
# 然后修改配置文件,如下

**修改 onlyoffice nginx https 配置,**主要配置证书目录和协议套件

## HTTPS host
server {
  listen 0.0.0.0:443 ssl http2;
  listen [::]:443 ssl http2 default_server;
  server_name v.itmm.wang;
  server_tokens off;
  root /usr/share/nginx/html;

  ## Strong SSL Security
  ## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
  ssl on;
  ssl_certificate /var/www/onlyoffice/Data/certs/你的证书.pem;
  ssl_certificate_key /var/www/onlyoffice/Data/certs/你的证书.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
  ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
  #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
  ssl_prefer_server_ciphers on;
  proxy_set_header X-Forwarded-For $remote_addr;
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
  ## [Optional] If your certficate has OCSP, enable OCSP stapling to reduce the overhead and latency of running SSL.
  ## Replace with your ssl_trusted_certificate. For more info see:
  ## - https://medium.com/devops-programming/4445f4862461
  ## - https://www.ruby-forum.com/topic/4419319
  ## - https://www.digitalocean.com/community/tutorials/how-to-configure-ocsp-stapling-on-apache-and-nginx
  # ssl_stapling on;
  # ssl_stapling_verify on;
  # ssl_trusted_certificate /etc/nginx/ssl/stapling.trusted.crt;
  # resolver 208.67.222.222 208.67.222.220 valid=300s; # Can change to your DNS resolver if desired
  # resolver_timeout 10s;

  ## [Optional] Generate a stronger DHE parameter:
  ##   cd /etc/ssl/certs
  ##   sudo openssl dhparam -out dhparam.pem 4096
  ##
  #ssl_dhparam /var/www/onlyoffice/Data/certs/dhparam.pem;

  include /etc/nginx/includes/ds-*.conf;
}

配置完成后文件复制回容器,然后重启nginx。

# 配置完成后文件复制回容器
docker cp /opt/seafile-onlyoffice/ds.conf onlyoffice:/etc/onlyoffice/documentserver/nginx/

# 将证书上传到 certs 目录(手动创建 certs 目录)
/opt/seafile-onlyoffice/data/certs/

# 重启 onlyoffice
docker restart onlyoffice

好了,这时候用https访问一下试试。

5. 配置 Seafile 调用 OnlyOffice

添加以下配置信息到/opt/seafile-data/seafile/conf/seahub_settings.py

# Enable Only Office
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = False
# ONLYOFFICE_APIJS_URL = 'http{s}://{your OnlyOffice server's domain or IP}/web-apps/apps/api/documents/api.js'
ONLYOFFICE_APIJS_URL = 'https://你的域名和端口/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')

配置完成后重启 seafile,然后从 seafile 就可以正常打开编辑 office 文档了。

# 重启 Seafile 服务
docker-compose restart

6. 配置 OnlyOffice 自动保存

使用 OnlyOffice 打开文件时,OnlyOffice 默认只会在用户关闭页面后向 Seafile 发送文件保存请求。 如果用户长时间未关闭页面,则用户对文件的更改将不会及时保存在Seafile上。

您现在可以通过更改 OnlyOffice 的配置来设置自动保存(实时保存)。

# 复制 onlyoffice容器中的配置文件 local.json 到主机
docker cp onlyoffice:/etc/onlyoffice/documentserver/local.json /opt/seafile-onlyoffice/

按照 Seafile 官方说明修改 local.json,json文件中增加 autoAssembly 配置

{
    "services": {
        "CoAuthoring": {
            // 在 CoAuthoring 中 增加 autoAssembly 属性配置
            "autoAssembly": {
                "enable": true,
                "interval": "5m"
            }
        }
    }
}

local.json 文件传回容器,然后重启 OnlyOffice

# 复制 local.json 到docker容器
docker cp /opt/seafile-onlyoffice/local.json onlyoffice:/etc/onlyoffice/documentserver/

# 重启 OnlyOffice
docker restart onlyoffice

7. [可选] 开启 onlyoffice 演示Demo

# 配置 onlyoffice 演示Demo
docker exec onlyoffice supervisorctl start ds:example

三、遇到的问题

1、Seafile 初始化完成后,启动报错,提示没有权限

错误信息:

chown: changing ownership of '/var/lib/mysql/': Permission denied

解决办法:

# 关闭selinux
vim /etc/sysconfig/selinux
# SELINUX=enforcing 改为 SELINUX=disabled

2、出现如下错误

/usr/bin/docker-current: Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/65f3c109fb903539820f84856d2725af784f2f03f95b1f0214e34184e4d61ff7-init/merged: invalid argument.
See '/usr/bin/docker-current run --help'.

解决办法:

# 停止docker服务
systemctl stop docker
# 清理镜像
rm -rf /var/lib/docker
# 修改存储类型
vi /etc/sysconfig/docker-storage
# 把空的DOCKER_STORAGE_OPTIONS参数改为overlay:
DOCKER_STORAGE_OPTIONS="--storage-driver overlay"
# 禁用selinux,去掉option的–selinux-enabled
vim /etc/sysconfig/docker
# 启动docker应该就可以了
systemctl start docker

#2

Mark,比较详细


#3

请问下域名是公网的域名吗?就是外网访问就通过域名访问。那内网访问,也可以通过这个域名访问到吗?


#4

是公网域名,正常情况下域名内网公网都可以访问,如果你不想让外网访问,可以不配置解析DNS,设置hosts就行


#5

这个配置解析DNS,是在内网的机器配置,还是在域名所在商那里配置?


#6

外网访问的在域名商哪里做解析


#7

好的,谢谢,我试试


#8

编辑超大文件怎么办呢?%E6%96%B0%E5%BB%BA%E4%BD%8D%E5%9B%BE%E5%9B%BE%E5%83%8F
没法编辑也没法下载,死循环


#9

你说的超大文件是多大呢?我试了90多兆的word是没问题的


#10

300MB 带视频的PPT


#11

300M是有问题,你可以看看这个打开大电子表格文件返回错误:“文件大小超过您的服务器的限制”#313
我尝试设置了
/etc/onlyoffice/documentserver/default.json中的 “maxDownloadBytes”: 504857600
/etc/onlyoffice/documentserver/nginx/includes/ds-common.conf 中的 client_max_body_size 500M
但是依然没有解决,文中提到一个server:maxFileSize属性,但是我没有找到在哪里设置,你可以研究一下。


#12

我的onlyoffice在seafile的网页上修改后不能同步到计算机上。但是保存在服务器上,这是怎么回事?


#13

我的倒是没这问题,修改完等下电脑就同步了,所以帮不到你了


#15

onlyoffice容器启动时可以添加如下参数设置JWT验证,避免完全公开访问
-e JWT_ENABLED=true
-e JWT_SECRET=secret
启动容器时比如:
sudo docker run -i -t -d --name onlyoffice --restart always -p 444:443 -p 88:80
-e JWT_ENABLED=true
-e JWT_SECRET=your_password
-v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data onlyoffice/documentserver

同时在seahub_settings.py中设置JWT_SECRET
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = True
ONLYOFFICE_JWT_SECRET = ‘your_password’
ONLYOFFICE_APIJS_URL = ‘https://xxx.xxx.com:444//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’)