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

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

在csdn也同步发布了,csdn上markdown格式显示效果更好些

https://blog.csdn.net/u013568040/article/details/123648666

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

你可能感兴趣的:(使用Docker-compose安装NextCloud,并部署Collabora作为office服务)