美文网首页
使用Docker-compose安装NextCloud,并部署C

使用Docker-compose安装NextCloud,并部署C

作者: 柒元_ | 来源:发表于2022-03-13 23:30 被阅读0次

    使用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,并部署C

          本文链接:https://www.haomeiwen.com/subject/wzredrtx.html