使用Docker-compose安装NextCloud,并部署Collabora作为office服务

使用Docker-compose安装NextCloud,并部署Collabora作为office服务

安装Docker和docker-compose

使用docker-compose可以更快速的构建nextcloud需要的各个服务

准备域名,启用SSL

2个子域名,分别用于Collabora Office和Nextcloud,且两个域名均拥有合法SSL证书,通过备案后在云服务商申请免费证书即可,证书授权一年。
例如:
nextcloud.eeeeeee.com用于访问Nextcloud,collabora.eeeeeeee.com用于部署Collabora Office

nginx的 SSL 证书可用腾讯云或阿里云每年授权一次的免费证书,就不用那个什么letsencrypt搞什么自动续签了,

docker-compose文件

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文件中涉及到的容器及参数配置

db:MySQL 数据库

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
redis:缓存服务
cron:后台事务
nextcloud:云盘主服务

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

proxy:云盘nginx代理服务

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
cloud_collabora:office预览服务

这里我也试了好几个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:定期备份Nextcloud文件和数据库

(暂时没部署)

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’代表只允许本机访问

配置redis

如果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服务即可

提示”php-imagick模块不支持SVG”

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; # 自行调整大小