部署redis容器
要为nextcloud部署onlyoffice容器,首先需要部署好redis容器:
docker run --name redis -d --restart=always --net=public-net -p 6379:6379 redis
创建bridge
建议大家养成良好的习惯,部署容器的时候,不管有用没有,最好都加上–net参数并使用同一个提前定义好的非默认的bridge,,便于需要的时候可以用容器名调用。因为下面要用到一个名为public-net的bridge,所以需要提前创建:
docker network create public-net
部署onlyoffice容器
命令如下
docker run --name onlyoffice -d --restart=always --net=public-net \
-p 9020:80 \
-p 9023:443 \
-e JWT_SECRET=xxxxxxxxxxxxxxx \
-e REDIS_SERVER_HOST=redis \
-e REDIS_SERVER_PORT=6379 \
-v /docker/onlyoffice/logs:/var/log/onlyoffice \
-v /docker/onlyoffice/data:/var/www/onlyoffice/Data \
-v /docker/onlyoffice/lib:/var/lib/onlyoffice \
-v /docker/onlyoffice/db:/var/lib/postgresql \
-v /docker/onlyoffice/redis:/var/lib/redis \
onlyoffice/documentserver
参数解释:
-p 9020:80 -p 9023:443
9020和9023端口分别对应容器内部的80和443端口,大家根据自己的实际部署环境自行调整。
-e JWT_SECRET
是指定一个固定的secret,这个环境变量如果不指定,那么每次docker重启secret都会重新生成,就会报错:
然后都需要去onlyoffice容器中去下列位置查看:
cat etc/onlyoffice/documentserver/local.json
secret": {
"inbox": {
"string": "YOURTOKEN"
},
"outbox": {
"string": "YOURTOKEN"
},
"session": {
"string": "YOURTOKEN"
}
这样非常不方便,强烈建议大家自己指定一个固定值。
-e REDIS_SERVER_HOST=redis
-e REDIS_SERVER_PORT=6379
指定redis服务器的地址和端口,因为redis和onlyoffice同属于一个非default的bridge"public-net",所以可以用容器名直接通信,否则就需要–link参数了。
注:大家在搭建容器环境的时候,建议提前规划好所有容器挂载文件夹的位置,我是所有容器的挂载文件夹都在/docker文件夹下,然后每个容器一个文件夹,例如/docker/onlyoffice/,之后才是这个容器对应的挂载文件夹,养成良好的习惯,后期维护会更方便,并且在迁移到新容器环境重新创建对应容器的时候,甚至连挂载路径都不用改,爽得一逼。
部署完成onlyoffice容器以后,默认没有启用example,需要执行:
docker exec onlyoffice sudo supervisorctl start ds:example
然后就能访问:http://x.x.x.x:9020:example
x.x.x.x假设是你容器宿主机的内网ip地址,页面如下:
如果要这个页面每次重启容器都自动启动,需要执行:
docker exec onlyoffice sudo sed 's,autostart=false,autostart=true,' -i /etc/supervisor/conf.d/ds-example.conf
配置nextcloud
接下来是在nextcloud里配置(需要提前安装好onlyoffice插件):
这里情况比较复杂,而且还根据客户端是纯内网访问,还是需要从外网访问,还分是http方式,还是https方式,分2种主流情况:
1、nextcloud和onlyoffice都只在内网且客户端浏览器用http方式访问
如果是纯内网访问http,那最简单,直接在上图右下更多设置下的"用于服务器内部的ONLYOFFICE Docs地址"选项下填写:http://x.x.x.x:9020
的方式指定onlyoffice的内网ip或者内网域名,然后在"用于ONLYOFFICE Docs内部请求的服务器的地址"选项下填写:http://x.x.x.x:9010
的方式指定nextcloud的内网ip或者内网域名(假定9010是nextcloud的宿主机映射端口)即可。
2、nextcloud和onlyoffice都部署在公网上且客户端浏览器用https方式访问
如果是这种情况,在保证onlyoffice能通过公网域名正常打开example页面的情况下,只需要在上图右上第一个红框"ONLYOFFICE Docs"处填写onlyoffice对应的https://公网域名
,然后在下方"密钥"处填写你前面创建容器时候自定义的secret即可。
注意:nextcloud使用https访问,则onlyoffice也必须使用https配置,所以建立onlyoffice容器的时候才会映射9023端口。如果onlyoffice是配合反代使用,那么onlyoffice所对应的公网域名的反向代理在指定上游服务器目标url的时候,需要使用https并且指向https的端口,在本例中,既指向https://x.x.x.x:9023
。
在创建onlyoffice容器的时候,我们做了以下目录的-v挂载:
-v /docker/onlyoffice/data:/var/www/onlyoffice/Data
这个data目录,就是用来放onlyoffice公网域名对应的ssl证书的目录。在data里创建certs目录,然后将对应onlyoffice域名的的ssl证书(crt,key)重命名成onlyoffice.crt和onlyoffice.key,放到这个目录下并重启onlyoffice容器即可。
保存以后如果nextcloud的onlyoffice页面多出了以下内容就成功了:
这种方式即可完成同一个容器环境下nextcloud和onlyoffice的部署,不需要像一些网友一样还单独建立一个有公网ip地址的服务器来搭建onlyoffice的容器,简单来说,就在一个内网环境下同时建立onlyoffice和nextcloud的容器,然后在出口上做相应配置即可。
另外可能还有很多种不同的部署情况,比如nextcloud和onlyoffice分别在内网、公网、反向代理之后,大家根据实际情况自己分析处理即可。