05
2024
06
15:50:39

Docker 部署 Nextcloud+Onlyoffice 以及常问题

mprop="articleBody" style="font-family: Lato, "PingFang SC", "Microsoft YaHei", sans-serif; overflow-wrap: break-word; font-size: 1.125em; text-align: justify; color: rgb(85, 85, 85); text-wrap: wrap; background-color: rgb(255, 255, 255);">

一、安装路线:

  •  【MySQL】

  •  【Nextcloud SSL 证书】

  •  【Nextcloud】

  •  【Onlyoffice SSL 证书】

  •  【Onlyoffice】

  •  【Nextclou 与 Onlyoffice 的配置】

1
第一步【MySQL】 =》第二步【Nextcloud SSL证书】=》第三步【Nextcloud】==》第四步【Onlyoffice SSL证书】=》第五步【Onlyoffice】=》第六步【Nextclou 与 Onlyoffice的配置】

第一步,用 Docker 部署 MySQL:

1
2
3
4
5
6
7
8
9
docker run -d --name mysql \
   -v /root/nextcloud/mysql:/var/lib/mysql \
   -e MYSQL_ROOT_PASSWORD=uH16uq3X4QSjaj74 \#改密码
   -e MYSQL_DATABASE=nextcloud \
   -e MYSQL_USER=nextcloud \
   -e MYSQL_PASSWORD=GmsnCOqG82g4uxTK \#改密码
   -p 3307:3306 \#改端口
   --restart=always \
   mysql:latest

第二步,制作 Nextcloud_SSL 证书(2022 年 9 月 26 日有效)

创建路径(文件夹)来存放待会制作的证书。这里用的地址是/docker/nextcloud/ssl。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir /docker/nextcloud/ssl
cd  /docker/nextcloud/ssl

#生成私钥
openssl genrsa -des3 -out server.key 2048

#生成CSR(证书签名请求)
openssl req -new -key server.key -out server.csr ###这条命令啥都可以填,但是Common Name FQDN必须是你的域名或者是ip(填写IP本作者没有有尝试过) 否则会出错。

#删除私钥中的密码
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

#生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

#改名 将server.crt改成cert.pem 将 server.key 改成 key.pem 直接改后缀改名就行,不需要转换
cp server.crt cert.pem
cp server.key key.pem

第三步,用 Dockerfile 构建并部署 Nextcloud+SSL

不想用Nginx反代理,虽然我知道Nginx性能会强一些,但是配置起来,弄得我头疼。所以用Nextcloud:apache直接解决SSL问题。

先准备一个路径用来放脚本和 Dockerfile 我这里用的是 /srv/nextcloud

编辑 Dockerfile

1
2
3
4
5
6
7
8
9
10
mkdir /srv/nextcloud
cd /srv/nextcloud

#如果有nano就用nano,有vim就用vim,实在不行那就vi吧, 新建一个Dockerfile,对名字就是Dockerfile
vi Dockerfile

#复制粘贴修改下面的代码
FROM nextcloud:apache
COPY setssl.sh /usr/local/bin/
RUN /usr/local/bin/setssl.sh admin@domain.xyz nextcloud.domain.xyz #admin@domain.xyz变成你的邮箱, nextcloud.domian.xyz变成你的域名

创建一个 setssl.sh 将证书注入到 Docker 镜像里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#然后再创建一个setssl.sh 将证书注入到Docker镜像里面(注入这个动词也不知道用的对不对)
vi setssl.sh
#复制粘贴或修改以下代码(假如你放证书的地址与我的不同,记得修改!!)

# setssl.sh
# USAGE: setssl.sh <email> <domain>

echo 'SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
SSLCompression off
SSLSessionTickets Off' > /etc/apache2/conf-available/ssl-params.conf
echo "<IfModule mod_ssl.c>
       <VirtualHost _default_:443>
               ServerAdmin $2
               ServerName $1
" > /etc/apache2/sites-available/default-ssl.conf
echo '
               DocumentRoot /var/www/html

               ErrorLog ${APACHE_LOG_DIR}/error.log
               CustomLog ${APACHE_LOG_DIR}/access.log combined

               SSLEngine on

               SSLCertificateFile    /etc/ssl/nextcloud/cert.pem
               SSLCertificateKeyFile /etc/ssl/nextcloud/key.pem

               <FilesMatch "\.(cgi|shtml|phtml|php)$">
                               SSLOptions +StdEnvVars
               </FilesMatch>
               <Directory /usr/lib/cgi-bin>
                               SSLOptions +StdEnvVars
               </Directory>
       </VirtualHost>
</IfModule>' >> /etc/apache2/sites-available/default-ssl.conf
a2enmod ssl >/dev/null
a2ensite default-ssl >/dev/null
a2enconf ssl-params >/dev/null
#保存退出

#赋予x执行权限
chmod +x setssl.sh

创建镜像

1
2
3
4
5
6
7
8
9
#创建镜像
docker build --tag nextcloud_ssl .
#部署nextcloud Docker镜像
docker run -d --name nextcloud \
   -v /root/nextcloud/data:/var/www/html \
   -v /etc/ssl/mydomain:/etc/ssl/nextcloud \#如果你证书位置和我的不一样记得修改
   --link mysql:mysql \
   --restart=always \
   -p 8443:443 nextcloud_ssl

第四步,制作 Onlyoffice 自签名证书

1
2
3
4
5
6
7
8
9
10
11
12
13
#创建一个certs目录
mkdir certs

#进入certs然后开始制作证书
cd certs

openssl genrsa -out onlyoffice.key 2048
openssl req -new -key onlyoffice.key -out onlyoffice.csr
openssl x509 -req -days 365 -in onlyoffice.csr -signkey onlyoffice.key -out onlyoffice.crt
openssl dhparam -out dhparam.pem 2048

#给key文件赋予400权限
chmod 400 onlyoffice.key

第五步,部署 Onlyoffice 容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -i -t -d --name onlyoffice \
-p 8000:80 \
-p 8443:443 --restart=always \
-e ONLYOFFICE_HTTPS_HSTS_ENABLED=true \#如果后面配置出错,那就把容器和路径删掉,onlyoffice重做,然后改成false
-e USE_UNAUTHORIZED_STORAGE=true \
-e JWT_SECRET=secret \#这个是在nextcloud onlyoffice配置页面里面的那个secret可以改成别的但一定要配置
-e JWT_HEADER=AuthorizationJwt \
-e JWT_IN_BODY=true \
-v /root/onlyoffice/DocumentServer/data/certs:/var/www/onlyoffice/Data/certs \#这个是证书放的位置
-v /root/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \
-v /root/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \
-v /root/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice \
-v /root/onlyoffice/DocumentServer/db:/var/lib/postgresql \
onlyoffice/documentserver

第六步、配置 Nextcloud 和 onlyoffice

1. 配置 onlyoffice 的自签证书

把刚刚在根目录上的 certs 复制到 /root/onlyoffice/DocumentServer/data/ 下。

复制完之后 cd 到 /root/onlyoffice/DocumentServer/data/certs 下 看看证书是不是都在。

然后用 portainer 进入 onlyoffice 的控制台。用终端 + docker 命令也行。

1
2
3
4
5
#进入这个地址 /etc/onlyoffice/documentserver
cd /etc/onlyoffice/documentserver
nano default.json
#找到rejectUnauthorized=true 改成 false
#保存退出

重启 onlyoffice 容器

1
2
#这个是我瞎写的,也不知道这样能不能重启
docker restart onlyoffice
  1. 配置 Nextcloud

https://ip:8443

一般配置,输入创建管理员的账号密码还有 MySQL 的数据库名,数据库登录用户密码还有数据库地址:3307, 注意这里数据库的地址只能填 LXC 的 IP + 端口,填 localhost 或者是 docker 的地址不管用。

重点来了,如果获取不了 App ,然后日志那边显示什么什么 TIMEOUT,

那么是因为在 1 分钟内没有下载好 app.json 所以需要求改一下 timeout 时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#这个文件在nextcloud/data里面,就是刚刚部署nextcloud容器 /var/www/html
vi lib/private/App/AppStore/Fetcher/Fetcher.php
#找到 options = 找到'timeout' => 60, 改成600 秒 10分钟
#保存退出
#方法来源:https://linuxfun.org/en/2021/07/02/how-to-resolve-nextcloud-no-apps-error-en/
#然后去修改config.php 添加信任域名'trusted_domains' =>,添加'default_phone_region' => CN,
#依旧在config.php 在两逗号之间加入下面代码
'onlyoffice' =>
          array (
   "jwt_secret" => "secret",#修改,如果跟你不一样
   "jwt_header" => "AuthorizationJwt",
   'verify_peer_off' => TRUE,
),
#注意逗号还有括号。

3. 配置 nextcloud/config.php

增加下面指令至档案并储存档案

1
'allow_local_remote_servers' => true,

img

二、常见问题

关于 Nextcloud 连接 Onlyoffice 成功后提示 “ONLYOFFICE 服务器无法连接,请联系管理员。”

img

好不容易才把 onlyoffice 连接成功,你竟然还给我来这个错误,实在是不应该呀,都最后一公里了,可不能放弃,必须得把它给解决。

现在不妨从开始说起:

在 Docker 容器内部,宿主机相当于一个网关,宿主机根据不同的端口给每个容器分配一个独立的 IP 地址。这时所有 Docker 上所有容器的 IP 都是基于 DNAT 和 SNAT 技术自动实现对内网的接入,本质上都是用宿主机的内网 IP 地址 + 宿主机端口,只是映射的端口号不同而以。此时宿主机与外界通信的接口是路由器,其使用的 IP 是内网 IP,还不能直接上网,必须经过路由器(路由器的一端连内网,一端连公网)的端口映射,再次把宿主机的端口映射到路由器的独立端口上(具体根据路由器设置),使用路由器的端口与公网连接,其本质也是利用路由器的公网 IP + 路由器的端口号。

所以容器在接入公网之前是经过了两层映射(套娃的既视感),两次端口转换:容器 —- 宿主机 —- 路由器。

img

宿主机内部各级映射,每级都有一个网关

现在安装 Nextcloud 和 Onlyoffice 容器,它们是两个不同的服务器,要连接成功,必须是两边都是互通的,才可以互访。前几天都是把 NC 和 OO 都部署在 NAS 服务器上,妄想基于 Docker 容器来实现两服务器的互访,虽然内网是没有问题的,但是外网却不一直连接不上,为啥呢?

这是因为我犯了个低级错误:因为对于 DNS 服务器来说来说,要将域名转换为 IP 地址,这个 IP 地址必须是公网地址,前面说到如果以回环的方式实现互访在内网是没有问题的,但是外网就显然不可能了。

既然不能直连,那我们可以用其它方法来实现,方案有三种:

方案一:能不能再增加一台以上设备来实现 “下一跳”,这样就可以 “欺骗” 路由器了。

img

于是,前几天配置的 WireGuard VPN 终于可以派上用场了,具体方法是在 “ONLYOFFICE Doc 地址” 栏填入 VPN 的地址:https://10.0.xx.xx: 端口号,在 “用于 ONLYOFFFCIE Doc 内部请求的服务器地址” 栏填入内网地址:https://192.168.xx.xx: 端口号。

img

但是,现实是腾讯给的公网带宽只有 4M,要实现多人在线办公 4M 的带宽还远远不够呀,还有一个问题是每个人都直面我的 NAS 服务器,是有风险的,所以不推荐。

方案二:因为我的 NAS 时双网口的,双网口就意味着有两个 IP 地址可用,让每个容器使用一个外网口,这样就实现了两个容器的相互连通,但是在实验过程中,因为不知道 ONLYOFFICE 默认使用的端口号,最终没有成功,所以就有了第三方案。

方案三:利用腾讯云轻量级服务器 Lighthouse 来实现,同样是通过 Docker 容器安装 ONLYOFFICE,相关过程自行百度或搜索 B 站或者 C 站,现在多人在线办公的网络拓扑图应该是这样的:

img

因为我的 NC 服务器时基于 https 访问的,此时 OO 也必须以 https 连接。

要实现 https 安全连接,有些繁琐,但是按照步骤一步一步来就很简单了,在安装好 OO 后,为了避免出现不必要的错误,还应该修改 NEXTCLOUD 容器配置文件‘conf.php’,步骤如下:

首先通过以下命令一步一步进入:

1
2
docker exec -it onlyoffice_id /bin/bah
nano conf/conf.php

在段落中插入以下内容:

1
2
3
4
5
'onlyoffice' =>
array (
   'verify_peer_off' => true,
 ),
 'allow_local_remote_servers' => true,

保存好后在浏览器中打开 “https:// 腾讯云公网 IP:OO 的端口”, 会出现如下页面,这个页面主要是为了测试 OO 是否正常工作的。

img

按照提示的步骤一步一步做,最后再点开 “GO TO EXAMPLE” 出现创建文档的页面,试着创建一个文档:

img

提示 “文件无法保存或无法下载” 的情况:

img

查阅多方资料后发现这是因为 docker node js 无法对客户端自签名证书进行认证:

解决办法:关闭客户端证书认证。

进入 ONLYOFFICE 容器并修改 default.json 文件。

1
2
docker exec -it 容器ID /bin/bash
nano /etc/onlyoffice/documentserver/default.json

修改如下代码:把 “true” 值改成 “false” 后,保存并退出。

1
"requestDefaults": { "headers": {                                  "User-Agent": "Node.js/6.13"                               },                                 "rejectUnauthorized": true  

再次回到容器,输入‘exit’退出容器,输入以下命令重启 ONLYOFFICE:

1
docker restart onlyoffice_id

好了,现在就可以在 onlyoffice 配置页面(依次点开 “头像”–“设置”—“ONLYOFFICE”)进行如下配置:

在 “ONLYOFFICE Doc 地址” 栏填入 “https://onlyoffice.com: 端口”,在 “用于 ONLYOFFICE Doc 内部请求的服务器的地址” 栏填入 NEXTCLOUD 的公网地址或域名,格式为 “https://onlyoffice.com: 端口”,保存,此时会出现 “设置更改成功” 的提示。

img

连接成功现在我们有要直面开头提到 “ONLYOFFICE 服务器无法连接” 错误了:

当我用 Chrome 浏览器 z 在 NC 打开 office 文件时,我以为会很顺利的打开,但是结果呢,无法连接,前面的工作可不能白做。

好吧,那我去 GitHub 看看有没有类似的问题,结果所有的问题源头都指向了 OO 服务器目录下的一个名为 api.js 文件,我自己到开浏览器的控制台查看也确实是那么回事,但是看着这个 js 文档,还是有些茫然,要不还是浏览器再试试吧,当我用 Edge 浏览器在 NC 上打开 OO 时,神奇的事发生了。

img

原来真的是浏览器问题,可能是浏览器的安全设置把 OO 给拦截了,那就一个一个的实验吧。

但是无论怎么设置浏览器,OO 都是无动于衷,再次用快捷键 “F12” 进入控制台,点开错误提示栏,找到有 “api.js“文件,点开 “api.js” 文件,直接跳到 “https://ONLYOFFICE 的地址 /web-apps/apps/api/documents/api.js“,再次刷新 NC,重新打开 office 文件,奇迹发生了,竟然正常打开。按照这个方法在 firefox 浏览器上见打开 “api.js“这个文件后,同样也可以打开 office 文件。

所以还真不是安全问题,我琢磨这估计是 Chrome 和 Firefox 浏览器无法抓取这个 api.js 文件,而 Edge 浏览器可以正常抓取这个文件,所以那两个浏览器才会出现服务器无法访问的错误,点击 api.js 这个文件打开后,浏览器就相应保存了这个 Cookie,所以还有一点就是在浏览器上设置 Cookie 时,一定不要选择 “退出时清理 Cookie” 这个选项。

img

还有要注意的是,应该在 “隐私设置和安全性” 的点击 “Cookie 及其他网站数据” 分别选择 “允许所有 Cookie”

img

提示 “INVALID TOKEN”、“秘钥没有正确生成” 错误

大家可以进入 ONLYOFFICE 容器内部查看‘‘local.json’’这个文件,内部路径为:‘‘/etc/onlyoffice/documentserver”,或者直接输入 “cat /etc/onlyoffice/documentserver/local.json”,打开该文件,找到如下相关的内容:

1
2
3
4
5
6
7
8
9
10
"secret": {
       "inbox": {
         "string": "YOURTOKEN"
       },
       "outbox": {
         "string": "YOURTOKEN"
       },
       "session": {
         "string": "YOURTOKEN"
       }

复制秘钥,然后再回到 Nextcloud 的 Onlyoffice 的设置界面,把复制好的秘钥粘贴到 “秘钥” 栏,点击‘‘保存” 按钮即可。

img

写在最后:NEXTCLOUD 的 BUG 还是有点多哈,我还走了很多弯路,花了不少的时间来学习,不过它确实很好用,而且是开源,用的人越多 BUG 就越少!!!!

参考资料:

https://helpcenter.onlyoffice.com/installation/groups-https-docker.aspx

https://linuxfun.org/en/2021/07/02/how-to-resolve-nextcloud-no-apps-error-en/

https://www.jianshu.com/p/a9497de4cbff

https://help.nextcloud.com/t/howto-running-nextcloud-over-self-signed-https-ssl-tls-in-docker/101973




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:http://hqyman.cn/post/6525.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: