docker 安装 nextcloud 网盘

nextcloud 在 dockerhub 上有两个用得比较多的镜像,一个是官方的 nextcloud,还有一个是 linuxserver/nextcloud。这里我使用后者。

创建容器

linuxserver/nextcloud – Docker Image | Docker Hub

这个页面里把创建容器时需要的参数列出来了。使用 portainer 部署的时候只需要把相关参数按照页面设置就可以。

端口部分我是把宿主机 10080 和 10443 映射到了容器的 80 和 443。

容器的 /data 则对应宿主机的 /mnt/xxx 文件夹。我这里的文件夹是通过 nfs 挂载的 nas 文件夹。

容器生成之后,通过 ip:10443 就可以访问了(不知道为什么 10080 不可以)。数据库选的宿主机的 MySQL,所以地址是 172.17.0.1。

但没有连接成功。

第一个问题是,点击安装之后就进入 502 页面了。进入容器查看了 nginx 日志发现是没有文件写入权限。通过 id 命令查看后发现容器里的用户为 991–abc。这是因为我在创建容器的时候把环境变量写错了。PUID 和 PGID 写成了 GUID 和 GPID。没办法,销毁重建吧。

数据库连接

这一次出现了另一个问题:数据库用户名或者密码错误???我可以确定用户名和密码是正确的(用的就是 root)。尝试了把密码加密方式改成 caching_sha2_password 还是无效。没办法,只能创建一个新账户,只授权 nextcloud 要用到的数据库。

这次总算连接数据库成功了。但是,一直在转圈,然后就 504 Gateway Time-out 了。[黑人问号]

改 nginx 超时时间应该可以解决,但没动手。我看了眼数据库,nextcloud 下各种表都创建了。于是刷新了页面,可以登录了。

nextcloud欢迎页面

总算进入 nextcloud 欢迎页面了。一波三折。太累。

您正在访问来自不信任域名的服务器

通过 zerotier 将本地 nextcloud 代理到公网。在中转服务器配置好域名之后打开就出现了“您正在访问来自不信任域名的服务器”的提示。

根据文档,修改了 config.php 文件的 “trusted_domains” 部分,把域名,服务器 ip,zerotier 虚拟局域网 ip 都加上了,还是无效。根据这篇文章(Nextcloud 通过不被信任的域名访问 动态IP解决方案,允许所有IP访问)的修改还是无效。最后,添加了一条通配符记录可以了。

部分文件 404

比如这个文件:remote.php/dav/files/root/。通过域名访问的时候会 404,导致页面一直 loading。这个是因为我服务器 nginx 的配置问题。

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name xxx.xxx.xx;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /xxx;


        include rewrite/other.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php.conf;

        location /
        {
            proxy_pass https://xxx.xxx.xxx;
            proxy_http_version 1.1;
            proxy_connect_timeout 4s;
            proxy_read_timeout 60s;
            proxy_send_timeout 12s;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            #proxy_set_header Host $http_host;
        }

        access_log  /home/wwwlogs/xxx.xxx.xxx.log;
    }

zerotier 反向代理的时候不需要太多配置,把除了 proxy_pass 的部分删掉。proxy_set_header 部分放开,否则 nextcloud 无法得知真实的请求域名。rewrite 和 enable-php.conf 部分也删掉就好了。

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name xxx.xxx.xx;
        index index.html index.htm index.php default.html default.htm default.php;


        location /
        {
            proxy_pass https://xxx.xxx.xxx;
            proxy_set_header Host $http_host;
        }

        access_log  /home/wwwlogs/xxx.xxx.xxx.log;
    }

应用商店安装失败

nextcloud 的应用商店有很多实用性较强的应用,这些应用可以丰富网盘的功能。比如笔记(notes)。

notes

但是,这些应用是需要连接 github 下载的。而总所周知,github 是 404 网站。

关于商城无法下载的问题,网上也有解决方案:Nextcloud应用页面空白加载不出来、Nextcloud应用商店无法打开 – 下一朵云 (orcy.net.cn)。但根据文章的说法,这个只是代理的商城列表部分,下载还是要 github 的。没办法,我只能配置 nextcloud 的代理,让其访问局域网里另一台可以访问 github 的系统。

// config.php
'proxy' => '192.168.0.130:7890'

在 nextcloud 的配置文件里增加这么一行就可以了。当然,我的过程没这么顺利。因为 192.168.0.130 访问不了。这一点我很奇怪,192.168.0.130 是宿主机(windows10),nextcloud 是装在虚拟机(ubuntuserver22.04)里的 docker 里。宿主机可以 ping 通虚拟机,但虚拟机 ping 不通宿主机。接下来就是折腾网络配置,确认 windows10 的防护墙全部关闭了,把 hyper-v 的桥接网卡删了重建,重启windows10。凌晨的时候,终于可以 ping 通宿主机了,nextcloud 也可以安装应用了。

至于,如何让 windows10 成为代理服务器,有空另写一篇。

总结

与桌面应用的易用性和稳定性比较起来,这些网络应用真的无力吐槽。正如 linux 的依赖地狱一样,一直在解决,但从未解决。

另外,通过代理访问 nextcloud 体验并不好。主要还是受制于延迟和带宽。