整活 · 12 6 月, 2022 0

Docker部署Nextcloud时遇到的坑以及解决办法

写在前面的废话

最近刚从ownCloud换成NextCloud。搭建自然还是通过docker,用的是官方提供的docker-compose。本以为会行云流水一切顺利,没想到还遇到不少坑。这里简单罗列一下部署过程中遇到的坑以及解决办法。

1. MariaDB无限重启

症状

编辑好docker-compose.yml文件,执行docker-compose up -d后用docker ps命令查看运行的容器,发现mariadb一直都是“restarting…”的状态。

解决方案

不知道有没有人通过修改pull的mariadb版本解决问题。这里建议一劳永逸,把mariadb替换成mysql。修改docker-compose.yml

# ...
services:
  db:
#    image: mariadb <- 删掉
    image: mysql # <- 修改成
    restart: always
# ...

停止+删除“restarting…”的容器,重新执行docker-compose up -d

2. 不信任的域名访问

症状

当访问NextCloud所用域名与第一次配置NextCloud时的所用域名不符时,网页会显示“通过不被信任的域名访问”页面。

解决方案
  1. 执行docker exec -it <NextCloud实例名/hash> bash进入容器控制台
  2. 编辑文件/var/www/html/config/config.php,找到
'trusted_domains' =>
array (
  0 => '<你第一次配置时用的host>',
),
  1. 添加访问用的域名
'trusted_domains' =>
array (
  0 => '<你第一次配置时用的host>',
  1 => '<其他访问域名1>',
  2 => '<其他访问域名2>',
# ...
),
  1. 退出容器控制台,执行docker restart <NextCloud实例名/hash>

3. HTTPS反向代理NextCloud后APP不能访问

症状

用Nginx等Web服务器反向代理NextCloud并添加证书后,手机APP登录NextCloud弹出错误信息,并且被强制登录到网页版。在APP里看网页版着实蛋疼。

解决方案
  1. 在“2. 不信任的域名访问”第2步提到的/var/www/html/config/config.php中添加以下内容:
'overwriteprotocol' => 'https',
  1. 退出容器控制台,执行docker restart <NextCloud实例名/hash>

注意:这样做会导致HTTP登录方式失效。所以要还是不要TLS,二者只能选其一。

4. NextCloud无法挂载SMB/CIFS

症状

无论是ownCloud还是NextCloud,挂在外部存储都需要安装“External storage”插件。但用官方compose脚本安装是默认不带samba支持的。因此在“External storage”设置界面会显示诸如“Samba支持未安装”之类的提示。

解决方案
  1. 用“2. 不信任的域名访问”第1步提到的方法进入容器控制台
  2. 执行安装脚本
apt-get update
apt-get install -y libsmbclient-dev smbclient
pecl install smbclient
docker-php-ext-enable smbclient

或者从部署阶段就解决问题:
1. 在docker-compose.yml所在目录创建文件Dockerfile并添加如下内容:

FROM nextcloud:apache
RUN apt-get update && apt-get install -y libsmbclient-dev smbclient && pecl install smbclient && docker-php-ext-enable smbclient
  1. 修改docker-compose.yml以下部分:
  app:
#    image: nextcloud <- 删掉
    build: ./ # <- 改为
  1. 停止+删除运行中的NextCloud容器,重新执行docker-compose up -d