Docker 部署 SeafilePro + OnlyOffice(CentOS版)

Docker Jan 18, 2021 1

前言

本教程完全基于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主页了。

image-20210118154458124

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

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

image-20210118150058662

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+端口应该就可以访问到了。

image-20210118152821461

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

image-20210118153845117

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

目录

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.