使用Docker-compose安装NextCloud,并部署Collabora作为office服务
在csdn也同步发布了,csdn上markdown格式显示效果更好些
https://blog.csdn.net/u013568040/article/details/123648666
使用docker-compose可以更快速的构建nextcloud需要的各个服务
2个子域名,分别用于Collabora Office和Nextcloud,且两个域名均拥有合法SSL证书,通过备案后在云服务商申请免费证书即可,证书授权一年。
例如:
nextcloud.eeeeeee.com用于访问Nextcloud,collabora.eeeeeeee.com用于部署Collabora Office
nginx的 SSL 证书可用腾讯云或阿里云每年授权一次的免费证书,就不用那个什么letsencrypt搞什么自动续签了,
docker-compose.yml
version: '3'
services:
db:
image: mariadb:10.5
container_name: nextcloud-db
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- ./mariadb/db:/var/lib/mysql
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_ROOT_PASSWORD=sd21111111111111111w
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=GXDw1111111111111111112
ports:
- 3306:3306
redis:
image: redis:alpine
container_name: nextcloud_redis
restart: always
expose:
- 6379
cron:
image: nextcloud:apache
restart: always
volumes:
- ./nextcloud_cron:/var/www/html
entrypoint: /cron.sh
depends_on:
- db
- redis
nextcloud:
image: nextcloud:apache
container_name: nextcloud_web
restart: always
volumes:
- ./nextcloud:/var/www/html
environment:
- NEXTCLOUD_ADMIN_USER=eeeee
- NEXTCLOUD_ADMIN_PASSWORD=L111231
- NEXTCLOUD_TRUSTED_DOMAINS='nextcloud.eeeeeeeee.com'
- REDIS_HOST=redis
- VIRTUAL_HOST=nextcloud.eeeeeee.com
- TZ=Aisa/Shanghai
- MYSQL_DATABASE=nextcloud
- MYSQL_ROOT_PASSWORD=sdeeeeew
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=GXeeeeee
- MYSQL_HOST=db
- UID=0
- GID=0
- UPLOAD_MAX_SIZE=10G
- APC_SHM_SIZE=1024M
- OPCACHE_MEM_SIZE=512
- CRON_PERIOD=15m
depends_on:
- db
- redis
links:
- db
cap_add:
- MKNOD
networks:
- cloud_net
- default
proxy:
image: nginxproxy/nginx-proxy:alpine
container_name: nextcloud_proxy
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/certs:/etc/nginx/certs:ro
- ./nginx/vhost.d:/etc/nginx/vhost.d
- ./nginx/html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx/conf.d:/etc/nginx/conf.d
networks:
- cloud_net
cloud_collabora:
image: collabora/code:6.4.14.3
container_name: cloud_collabora
environment:
- domain=nextcloud\.eeeeeeeeeeeeeeee\.com
- username=yaeeeee
- password=qingfeeeeeeeeeeeu
- dictionaries=de en es zh
cap_add:
- MKNOD
ports:
- 9980:9980
restart: always
volumes:
- ./collabora/coolwsd.xml:/etc/coolwsd/coolwsd.xml
networks:
- cloud_net
networks:
cloud_net:
docker-compose.yml文件中涉及到的容器及参数配置
mariadb是完全兼容mysql的
command:是一个隔离级别的东西,不知道干嘛的,官方文档里并没写
volumes:为了不把其他目录搞乱,我比较喜欢把文件挂在当前目录下,我在 /home/dc/nextcloud/ 文件夹下执行安装命令,文件都会创建在这个下面。
volumes,作用是,将宿主机的目录挂载到docker容器中,这样操作文件时,不用登录docker容器了,直接在宿主机操作就可以了。
如果你使用的是windows版本的docker, 建议买个linux的云服务器,腾讯云双十一的时候都不贵的。
environment:这里设置了root账户的密码,还有给nextcloud使用的账户密码和数据库
db:
image: mariadb:10.5
container_name: nextcloud-db
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- ./mariadb/db:/var/lib/mysql
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_ROOT_PASSWORD=sd4eeeeee
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=Geeeeeee
ports:
- 3306:3306
image:这里我选用的是nextcloud:apache镜像,因为apache的更能看明白一点
environment:
NEXTCLOUD_ADMIN_***** 配置项里面nextcloud的管理员账号密码。这里如果不设置,应该也可以在初始化的时候设置;
REDIS_HOST直接用redis,可能因为我们启了一个名字是redis的容器;
VIRTUAL_HOST这个应该是给ngnix用的,就用nextcloud的域名就可用;
MYSQL_*****这个是数据库相关设置,和db容器的一致就可以联上;
UID GID是nextcloud操作文件时的用户权限,可用id命令查询用户的uid和gid,我用的是root用户的id。id权限不足回导致上传文件只有文件名不能正常写入文件;
其余的各种上限的配置就按着写就够用了;
cap_add: - MKNOD这个也是一个容器权限相关的设置,控制容器对宿主机文件的操作,MKNOD允许容器使用mknod(2)创建特殊文件;
nextcloud:
image: nextcloud:apache
container_name: nextcloud_web
restart: always
volumes:
- ./nextcloud:/var/www/html
environment:
- NEXTCLOUD_ADMIN_USER=yanglijun
- NEXTCLOUD_ADMIN_PASSWORD=eeeeeeeeeeeeeeeeeeeeeeeeewew
- NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.weqeq
- REDIS_HOST=redis
- VIRTUAL_HOST=nextcloud.sevewnqweq
- TZ=Aisa/Shanghai
- MYSQL_DATABASE=nextcloud
- MYSQL_ROOT_PASSWORD=sd42YGwqewqewqewqw
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=GXwqewqewqwqu
- MYSQL_HOST=db
- UID=0
- GID=0
- UPLOAD_MAX_SIZE=10G
- APC_SHM_SIZE=1024M
- OPCACHE_MEM_SIZE=512
- CRON_PERIOD=15m
depends_on:
- db
- redis
links:
- db
cap_add:
- MKNOD
networks:
- cloud_net
- default
volumes: - 宿主机:容器 需要在阿里云把证书下载并放在 ./nginx/certs/
proxy:
image: nginxproxy/nginx-proxy:alpine
container_name: nextcloud_proxy
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/certs:/etc/nginx/certs:ro
- ./nginx/vhost.d:/etc/nginx/vhost.d
- ./nginx/html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx/conf.d:/etc/nginx/conf.d
networks:
- cloud_net
这里我也试了好几个office预览的服务,包括onlyoffice占用内存会特别多,微软官方的officeOline2013,部署太麻烦了,最终选择了collabora,并且nextcloud还有直接可用的插件,内置的插件对中文支持不好,所以就用这个单独部署的了。这个单独部署的是支持中文的。
environment:
domain一定要设置正确(哪个网站上要用collabora就设置那个网站的地址,不是设置collabora在用的域名),否则在collabora预览的时候会一直初始化然后就没有然后了。
如果要让这个Collabora Office同时服务于多个域名的话,需要在两个不同域名之间加上|,例如:
domain=cloud\\.nextcloud\\.com\|second\\.nexcloud\\.com
username和password是collabora管理后台的账号密码,管理后台的访问地址是https://collabora.seeeeeeee.com/loleaflet/dist/admin/admin.html
如果浏览器打不开新开一个浏览器就好了
cap_add: - MKNOD这个设置用于让collabora能够正常写缓存
cloud_collabora:
image: collabora/code:6.4.14.3
container_name: cloud_collabora
environment:
- domain=nextcloud\.eeeee\.com
- username=eeeeeeeeeeeeee
- password=qieeeeeeeeeeeeeeeeeee
- dictionaries=de en es zh
cap_add:
- MKNOD
ports:
- 9980:9980
restart: always
volumes:
- ./collabora/coolwsd.xml:/etc/coolwsd/coolwsd.xml
networks:
- cloud_net
(暂时没部署)
backups:
image: christophetd/duplicacy-autobackup:v1.0
container_name: backups
restart: always
environment:
BACKUP_NAME: "${BACKUP_NAME}"
BACKUP_LOCATION: "b2://${B2_BUCKET}"
BACKUP_SCHEDULE: "${BACKUP_SCHEDULE}"
BACKUP_ENCRYPTION_KEY: "${BACKUP_ENCRYPTION_KEY}"
B2_ID: "${B2_ID}"
B2_KEY: "${B2_KEY}"
volumes:
- "${DATA_DIR}:/data"
在docker-compose.yml文件所在目录,运行以下命令:
docker-compose up -d
我在配置完成后,把nextcloud的端口关了,nextcloud服务默认是运行在80端口的(在容器内的80端口),初次安装可用ports把80端口露出来。
命令完成后,就可以用http://宿主机IP:端口,来访问nextcloud了。
如果运行docker-compose,提示权限不够,解决方法:
chmod +x /usr/local/bin/docker-compose
访问首页,进行初始化设置,就不用在这里设置了
进入mysql:
mysql -u root -p
建立数据库
create database nextcloud;
建立数据库用户
create user '你的数据库用户名'@'%' identified by '你的数据库密码';
将数据库用户与数据库关联起来,并允许所有IP访问此数据库
GRANT ALL PRIVILEGES ON 你的数据库用户名 TO '你的数据库用户名@'%' IDENTIFIED BY '你的数据库密码' WITH GRANT OPTION;
刷新权限信息
flush privileges;
参数解释:
nextcloud,代表对这个数据库有效,如果换成*.* ,代表对任意数据库任意表有效
‘%’ 允许任意IP访问数据库,如果换成’localhost’代表只允许本机访问
如果doker-compose.yml添加了redis服务,需要编辑nextcloud的php配置文件来启用服务,配置文件路径是./nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'redis', #如果是在本机就是localhost,如果是docker,要和Redis的名一致
'port' => 6379,
),
应用商店是在墙外的,如果服务器联网不科学,是无法访问到的,即使额能访问到也没法安装成功应用。
国内有一个非常优秀的镜像可用使用,地址 https://www.orcy.net/ncapps/v1/
配置文件路径是/docker/nextcloud/config/config.php,修改配置文件,在最后添加
注意最后也是有逗号的
'appstoreenabled' => true,
'appstoreurl' => 'https://www.orcy.net/ncapps/v1/',
如果域名不受信任,即使指向了nextcloud的服务地址,也是无法打开的,需要在配置文件./nextcloud/config/config.php,修改配置文件,找到trusted_domains,在下面的数组中按编号新增自己的域名,如果是带端口的端口也要写上,有IP的IP也要写
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'nextcloud.eeeeeeeeeeeeee.space',
2 => 'collabora.eeeeeeeeeeeeeeee.space',
),
管理员后台【概览】页提示【您的安装没有设置默认的电话区域…】
编辑 Nextcloud config 目录中的 config.php 文件,在文件最下方, ); 前添加如下代码
注意,每行代码后需添加英文逗号。
'default_phone_region' => 'CN',
挂载外部存储提示"smbclient" 未安装。无法挂载 “SMB / CIFS”, “SMB / CIFS 使用 OC 登录信息”。
https://qingflow.com/tag/37253/app/c3ab1815/list/1?applyId=53805827
进入Nextcloud容器:
docker exec -it nextcloud_web /bin/bash
apt 更新可用软件包列表:
apt update
用apt安装:
apt install smbclient libsmbclient-dev
pecl install smbclient
docker-php-ext-enable smbclient
重启Docker服务即可
https://www.himstudy.net/%e8%a7%a3%e5%86%b3nextcloud%e6%8f%90%e7%a4%baphp-imagick%e6%a8%a1%e5%9d%97%e4%b8%8d%e6%94%af%e6%8c%81svg%e7%9a%84%e9%97%ae%e9%a2%98/
管理员后台【概览】页提示“此实例中的 php-imagick 模块不支持 SVG。为了获得更好的兼容性,建议安装它。
首先进入容器中
docker exec -it nextcloud_web /bin/bash
输入“apt install libmagickcore-”,然后双击tab键,会显示以“libmagickcore-”开头的组件列表。
然后继续敲入完整的安装命令,安装“libmagickcore-6.q16-6-extra”组件。
apt install libmagickcore-6.q16-6-extra
安装完毕重启docker,然后问题就搞定了。
链接教程中是说要重启apache2,如果有安装php-fpm,需一并重启,笔者是php7.4-fpm,如下:
service apache2 restart
service php7.4-fpm restart
再次刷新管理后台【概览】页,问题解决。
另一种在容器外直接操作的方法(不记得是否验证过):
https://techoverflow.net/2021/08/17/how-to-fix-docker-nextcloud-module-php-imagick-in-this-instance-has-no-svg-support-for-better-compatibility-it-is-recommended-to-install-it/
docker-compose exec nextcloud_web apt -y update
docker-compose exec nextcloud_web apt -y install libmagickcore-6.q16-6-extra
弄完以后,我测试发现填写完用户名及密码之后,点击登录无法跳转到主页。但是刷新一下又是登录状态了,最后上网查了下,这是因为web使用https反向代理了http导致的。只需要在配置文件(/config/config.json)中加上一条信息就可以了。
'overwriteprotocol' => 'https',
这个网页上传应该会遇到,因为Nginx做了限制。
首先,映射出Nginx的配置文件:
-v /volume1/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
然后修改一下,添加一个参数就可以了:
client_max_body_size 2048M; # 自行调整大小