Docker系列 搭建个人云盘服务nextcloud
本文最后更新于 281 天前,如有失效请评论区留言。

本博客由Faconhost大力赞助!如何更快地访问本站?有需要可加电报群获得更多帮助。本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!

日志

  • 2023-11-26:新增浏览器上传文件至Nextcloud速度太慢的建议。
  • 2023-07-26:修复关于WebP格式预览的bug。详见“警告&bug——无法预览常见格式的文件
  • 2023-07-23:新增上传>512M的文件的相关设置。
  • 2023-06-02:尝试修正Apache服务器的“MaxRequestWorkers”报错。详见“警告&bug——MaxRequestWorkers”小节。
  • 2023-02-05:修正和完善“警告&Bug”的相关教程,特别是不安全URL、默认电话区域等警告的处理方法
  • 2023-02-03:更新关于Nextcloud对CPU/内存性能要求的提示;专门优化“警告&Bug”。
  • 2022-12-21:docker-compose.yml的app部分设置container_name参数,以避免Docker Compose版本相关的命名冲突。
  • 2022-12-19:添加代理服务器的相关设置。具体方法是往config.php文件里添加一条proxy记录。

前言

本教程适合在低性能主机或应用场景比较简单时安装。更强性能的Nextcloud请参考《Docker系列 搭建nextcloud-fpm + nginx网络服务器》。

虽然我们前面介绍了图床之类的Docker应用,但其实云盘服务才是更加贴近大众生活的Docker应用。

Nextcloud是一个类似于百度网盘、阿里云盘的服务,可以通过docker容器的方式搭建在自己的个人服务器或NAS上,有安卓和IOS客户端。我不知道有没有人在VPS上布署nextcloud。一般都是NAS用户吧!有中文界面。我个人一般是用于进行手机照片的云同步,同时还储存一些小文件,并且偶尔可以分享文件给朋友,此时朋友下载文件的速度不像免费百度云那样受到限制。

Nextcloud除了基本的文件云同步和云储存的功能外,其实还有很多进阶功能,以后有机会再开系列博文来描述它的使用吧。

本篇博文主要讲述如何通过docker来安装Nextcloud,并且借助NPM进行ssl证书的申请和自动续期。安装docker应用往往不是难事,难就难在如何方便地获得https,而这个和个人信息安全密切相关的主题在多数教程中均少有提及。

Nextcloud的特别之处还在于:Nextcloud仅仅提供特色功能。它的性能提升往往依赖其它应用,比如MYSQL和Redis;它的拓展性往往依赖强大的插件。如果你用默认的方法安装docker nextcloud,那么它的性能会受到较大的限制。

本回的安装方法是一种对Nextcloud性能有较大提升并且较为简便的方法。原理上,唯一不同的是我们采用Nextcloud原生app,即使用Apache进行80端口映射,而不是像《Docker系列 搭建nextcloud-fpm + nginx网络服务器》中采用Nginx+Nextcloud:fpm的方法。

最后提醒一下:这个方法配置的Nextcloud对NAS的CPU和内存的占用还是比较大的。比如,蜗牛星际(J1900 4G内存)和PVE-OpenMediaVault虚拟机(G5400T 16G)里Nextcloud的表现差别就挺大的。我当时测试的OMV虚拟机硬件如下:

msedge_e6jILlN0hF

当我进入媒体库快速预览图片时,Nextcloud会持续调用大量的CPU资源来获取清晰的预览图:

MobaXterm1_CHS_5fnk4gPRCp

暂不确定是不是使用了apache2代理导致的性能损耗;但总体来说速度还可以;与之相比,蜗牛星际运行Nextcloud的时候真的就是“蜗牛”了 (ฅ´ω`ฅ)。另外,我暂不确定低盘位ZFS阵列的效率对Nextcloud表现有多大影响。 不过,如果你想比较流畅地使用Nextcloud,还是建议服务器的CPU性能和内存大小的水平要尽可能拔高一些

其它关于nextcloud的其它信息,可以访问:

另外,如果有使用非443端口的NAS的童鞋在安装Nextcloud中有任何问题的,欢迎评论区留言。我什么坑都踩过!

测试环境

我是在VPS里演示Nextcloud安装的:

uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
docker --version # Docker version 20.10.5, build 55c4c88
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f

准备工作

按需修改工作目录:

work=~/docker/nextcloud && mkdir -p $work && cd $work

按需修改端口,开启防火墙:

sudo ufw allow 7602/tcp comment 'nextcloud' && sudo ufw reload && 
sudo ufw allow 6379/tcp comment 'nextcloud' && sudo ufw reload

值得注意的是,这里使用的nextcloud:latest镜像是基于apache网络服务器构建的简单镜像,只有基本功能。如果你想要一些比较全的功能(比如基于ffmpeg自动预览图片等),推荐根据docker/.examples/dockerfiles/full/apache的内容自己build一个镜像;具体方法类似于《Docker系列 搭建nextcloud-fpm + nginx网络服务器》。

配置yml文件

不了解docker compose的小伙伴请看:《Docker系列 了解Docker Compose的配置文件

添加一个docker-compose文件:

vim $work/docker-compose.yml

添加以下内容:

---
version: '3.2'

networks:
  default:
    name: nextcloud

services:
  app:
    image: nextcloud:latest
    container_name: nextcloud # 容器名
    restart: unless-stopped
    volumes:
      - ./app:/var/www/html
    environment:
      - MYSQL_PASSWORD=nextcloud_password # 按需修改,不要含有$字符
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db
    ports:
      - 7602:80 # 按需修改
    networks:
      - default

  cache:
    image: redis
    restart: unless-stopped
    expose:
     - "6379" # 可用此默认。因为这是暴露而不是映射
    volumes:
     - ./cache:/data
    command: redis-server --requirepass 'redis_password' # 按需修改,不要含有$字符
    networks:
      - default

  db:
    image: mariadb:latest
    restart: unless-stopped
    # 下面的command与官网略有不同。它将有助于避免MYSQL数据库的4047报错。
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=nextcloud_password_root # 按需修改,不要含有$字符
      - MYSQL_PASSWORD=nextcloud_password  # 按需修改,不要含有$字符
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    networks:
      - default

上线服务

cd $work && docker-compose up -d

配置NPM

不了解Nginx Proxy Manager用法的小伙伴,请看《Docker系列 两大神器NPM和ddns-go的安装》。

ddns-go或者域名托管商后台解析好域名nextcloud.exampledomain.com

添加一个Proxy Host,反代地址是http://172.17.0.1:7602。可用泛域名的SSL证书。

Advanced中添加以下记录以增强兼容性。详见官网配置关于反代的说明

location /.well-known/carddav {
    return 301 $scheme://$host/remote.php/dav;
}

location /.well-known/caldav {
    return 301 $scheme://$host/remote.php/dav;
}

完整配置图如下所示:

image-20220423133539510

NPM有443端口时的Nextcloud配置

观察Nextcloud的客户端日志,当出现:

Initializing finished
New nextcloud instance

即可直接登陆网站:https://nextcloud.exampledomain.com进行设置。

我随便设置一个帐户。这个可以自定义!

admin
GoK*@s$&3%oXiQTewxoE*v*5@Q*a!D7WGLQDbwFt!NTiaQ!P6DUf5v

如图所示:

image-20220423134053110

如果安装过程中出现类似这种报错:

Error while trying to create admin user: Failed to connect to the database: An exception occurred in the driver: SQLSTATE[HY000] [1045] Access denied for user 'nextcloud'@'172.30.0.3' (using password: YES)

很有可能是你将mariadb/mysql的root和nextcloud用户的密码搞反了,纠正即可。不要问我是怎么发现的 (ฅ´ω`ฅ)

有些人不安装推荐应用。我这里就直接安装试试看。国内环境安装速度也还行。你也可以不点,反正你需要的话以后可以自己装嘛!最后,耐心地等待初始化的完成吧。

image-20220423134333283

很快就成功了。有443端口就是简单!

最后,为了让redis生效,我们需要配置$work/app/config/config.php:

sudo vim $work/app/config/config.php

添加以下内容:

//'memcache.local' => '\\OC\\Memcache\\APCu' // 用本地式缓存使用APCu // 注释这行 
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis', // 分布式缓存使用Redis
'memcache.locking' => '\\OC\\Memcache\\Redis', // 启用Redis缓存的文件锁
'redis' => array(
  'host' => 'cache', // 这里和mariadb的逻辑相同,填写容器links时映射的主机名。不推荐写IP地址,因为容器重启会失效。
  'port' => 6379,
  'password' => 'redis_password' // 这是之前在配置docker-compose时配置的redis密码
),
'filelocking.enabled' => 'true',
// 强制https(如果没有则加上)
'overwriteprotocol' => 'https',
// 默认的电话区域(如果没有则加上)
'default_phone_region' => 'CN',

然后重启docker-nextcloud服务:

cd $work && docker-compose down && docker-compose up -d

NPM无443端口时的额外配置

当初我在NAS安装Nextcloud的时候,没有443端口,安装Nextcloud非常地费劲!有时跳转的时候,地址栏的<NPM-443端口>可能会消失掉。

经过一翻折腾,我发现用非443端口使用Nextcloud还要进行一些额外的配置。相关的教程非常的少,真的恶心!市面上很多Up主也是直接在自己的NAS里安装Nextcloud,但他们往往是在局域网中使用Nextcloud,不会配https。然而作为一个云盘,没有https能忍吗?

又或者他们只在VPS中演示怎么安装。如上所述,如果你有443端口,这些问题根本不可能出现。

下面我们对于无443端口的NAS给另外一些配置上的建议。

首先,上线服务后不要登陆网站并注册用户。我们修改$work/app/config/config.php文件的内容:

sudo vim $work/app/config/config.php

在文件中添加以下内容:

如果内容已经有默认值,则添加或更改记录即可。比如trusted_domains。自己看着办!

每一行最后的,号一定不可以省略!

//'memcache.local' => '\\OC\\Memcache\\APCu' // 用本地式缓存使用APCu // 注释这行 
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis', // 分布式缓存使用Redis
'memcache.locking' => '\\OC\\Memcache\\Redis', // 启用Redis缓存的文件锁
'redis' => array(
  'host' => 'cache', // 这里和mariadb的逻辑相同,填写容器links时映射的主机名。不推荐写IP地址,因为容器重启会失效。
  'port' => 6379,
  'password' => 'redis_password' // 这是之前在配置docker-compose时配置的redis密码
),
'filelocking.enabled' => 'true',
'trusted_domains' => 
array (
    0 => '<nextcloud.exampledomain.com>', // 这一般是可以识别,不用改
),
'overwritehost' => '<nextcloud.exampledomain.com>:<NPM-443端口>', // 按需修改
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'http://<nextcloud.exampledomain.com>:<NPM-443端口>', # 这里有个逗号不要忘记

为什么要特别地设置config.php文件的相关参数呢?如果访问地址带端口号且属于反向代理,nextcloud往往无法正确地识别,此时nextcloud内部将阻止此地址对nextcloud进行访问。因此,我们需要提前对overwritehost变量进行特别声明。overwriteprotocoloverwrite.cli.url是为了强制https访问,这里也顺便加上以防NPM的设置不生效(还没试过删除会不会影响登陆)。

如图所示(如果没有设置管理员帐户,有些参数和值是没有;但我们要设置的几个参数的样式是类似的):

image-20220411112948184

重启服务,让config.php的改动生效:

cd $work && docker-compose down && docker-compose up -d

观察nextcloud客户端的日志(也可以用Portainer看):

docker logs -f nextcloud

当log出现Command line: 'apache2 -D FOREGROUND'的字样时,说明nextcloud已经重启成功。

此时可以访问https://<nextcloud.exampledomain.com>:<NPM-443端口>创建管理员帐户。后面的操作和VPS一样。设置完管理帐户后,可以自动登陆或者访问https://<nextcloud.exampledomain.com>:<NPM-443端口>登陆后台使用nextcloud。

如果你不小心注册了帐户再来修改config.php,在日志中很可能会有这种报错:

[access_compat:error] [pid 32] [client <你的电脑ip>] AH01797: client denied by server configuration: /var/www/html/data/htaccesstest.txt

这全是由于地址原因导致的htaccess不过关。所以端口号的问题真的很烦!这个时候你可以重新注册一个帐户。这个时候的系统就会有2个用户。它们的权限区别我以后再了解一下。

添加代理服务器(可选)

比如,你安装了一个docker版clash,如下图所示:

image-20221219084927806

为了解决网络连接难等问题,可以在$work/config/config.php里添加一个Proxy:

'proxy' => '172.17.0.1:7890',

其中,172.17.0.1是docker的网关地址,而7890的http流量都会流经这个docker版clash。大致解释是这样,具体情况要看你安装了什么proxy应用。如果是国内VPS安装Nextcloud且家里有用代理类服务,可以添加此项喔!

不过,个人认为搞软路由并装全局的openclash/v2rayN/ShadowSocksR Plus+之类的软件才是最佳选择 (ฅ´ω`ฅ)

警告&Bug

Nextcloud安装完后还要做很多细致的配置才能达到最佳性能。这里记录Nextcloud使用过程中出现的bug或需要纠正的警告。如果Nextcloud的环境完全配置正确,管理——概览——安全与设置警告的状态会提示所有检查已通过

msedge_mNSxhVP52L

别人的文章Docker 搭建 Nextcloud – 腾讯云开发者社区也有说明该如何排除Warning。前面关于config.php的设置其实已经避免了某些常见的情况。

添加后台任务

Nextcloud的官话,自己感受一下:为了优化性能,正确配置后台任务非常重要。对于较大的实例,推荐配置为 ‘Cron’。详情请参考相关文档。

根据使用docker-compose搭建nextcloud+Nginx+MySQL+Redis大佬文章的建议:由于nextcloud内部的文件和配置会在用户操作过程中产生变化,所以需要启用一个定时任务去定期整理和归档这些数据到数据库或者应用到配置中。问了ZoniNG大佬,这个也是必要的,说是属于php的优化。

如果你不配置,可能在设置——管理——基本设置会有这种警告:

image-20220425090053436

首先使用docker ps -a查看nextcloud的容器ID。接着,打开crontab的配置进行编辑:

sudo vim /etc/crontab

加入如下内容:

# run nextcloud cron task every 5 min
*/5 * * * * root docker exec -u 33 nextcloud-app-1 php -f /var/www/html/cron.php 2>&1 /dev/null

其中的nextcloud-app-1是nextcloud镜像的name,请按实际情况修改。

添加完成后立即生效,不需要额外操作。

这里我留个小问题:root可否换成test_user(就是你自己用的非root用户)?欢迎大家在评论区留下自己的答案!

不安全URL

管理——概览——安全与设置警告可能会出现该警告:

你正通过安全连接访问你的实例,然而你的实例正生成不安全的 URL。这很可能意味着你位于反向代理的后面,覆盖的配置变量没有正确设置。

可以编辑$work/app/config/config.php,添加类似下面代码:

'trusted_domains' => 
array (
  0 => 'nextcloud.moeci.com',
),
'overwriteprotocol' => 'https',

其中这个nextcloud.moeci.com要更换成你自己的nextcloud域名。运行这一步之前,要看看trusted_domainsoverwriteprotocol的值是否已经存在,不要重复添加。

修改完成后通过docker-compose restart重启Nextcloud Stack即可。

caldav解析

管理——概览——安全与设置警告可能会出现该警告:

您的网页服务器未正确设置以解析“/.well-known/caldav”。

修改Nginx设置即可,这里仅以Nginx Proxy Manager的设置为例。在Advanced中添加以下记录以增强兼容性。详见官网配置关于反代的说明。具体如下:

  • 有443端口的机器(比如VPS):
location /.well-known/carddav {
    return 301 $scheme://$host/remote.php/dav;
}

location /.well-known/caldav {
    return 301 $scheme://$host/remote.php/dav;
}
  • 无443端口的机器(比如家用NAS):这里的<npm的443端口>按实际情况修改即可。
location /.well-known/carddav {
    return 301 $scheme://$host:<npm的443端口>/remote.php/dav;
}

location /.well-known/caldav {
    return 301 $scheme://$host:<npm的443端口>/remote.php/dav;
}

添加完成立即生效,不需要额外操作。

启用HSTS

管理——概览——安全与设置警告可能会出现两条橙色记录:

你正通过安全连接访问你的实例,然而你的实例正生成不安全的 URL。这很可能意味着你位于反向代理的后面,覆盖的配置变量没有正确设置。
"Strict-Transport-Security" HTTP 头未设为至少 "15552000" 秒。为了提高安全性,建议启用 HSTS。

image-20220424194711757

在本教程中,Nextcloud使用的是Apache反代,因此,你可以在Nextcloud的根目录修改.htaccess文件——它是一个隐藏文件,因此要用ls -hla才可以显示:

Code_kEllqmYUSp

只要在.htaccess文件中找到IfModule mod_env.c,添加下列项目:

<IfModule mod_env.c>
  Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>

如下图所示:

image-20221218190030452

如果使用了Cloudflare的CDN服务,可参考Docker 搭建 Nextcloud进行相关的设置。如果使用Nginx反代,请参考官方文档或扩展阅读里的讨论链接。

修改完成后通过docker-compose restart重启Nextcloud Stack即可。

默认电话区域

参考:解决Nextcloud提示“您的安装没有设置默认的电话区域”的问题

如果在管理——概览——安全与设置警告里有以下警告:

您的安装没有设置默认的电话区域。这对验证配置设定中没有国家代码的电话号码而言是必需的。要允许没有国家代码的电话号码,请添加带区域相应的 ISO 3166-1 code ↗ 的“默认_电话_区域”到你的配置文件中。

可以编辑$work/app/config/config.php,添加以下记录:

'default_phone_region' => 'CN',

这里的CN代表“China”,即中国的意思。其它国家请点击ISO-3166-1查找国家代码。

修改完成后通过docker-compose restart重启Nextcloud Stack即可。

数据库丢失索引

如果在管理——概览——安全与设置警告里有以下警告:

msedge_bdJV47dEUd

看到类似下面的信息:

数据库丢失了一些索引。由于给大的数据表添加索引会耗费一些时间,因此程序没有自动对其进行修复。您可以在 Nextcloud 运行时通过命令行手动执行 "occ db:add-missing-indices" 命令修复丢失的索引。索引修复后会大大提高相应表的查询速度。
...

如它所描述的,就是数据库丢失了一些索引。你可以运行类似命令进行修复:

# 格式为:docker exec -u 33 <nextcloud容器name> /var/www/html/occ db:add-missing-indices
# docker exec -u 33 nextcloud-app-1 /var/www/html/occ integrity:check-core
# docker exec -u 33 nextcloud-app-1 /var/www/html/occ config:app:set --value 524288000 files max_chunk_size
docker exec -u 33 nextcloud-app-1 /var/www/html/occ db:add-missing-indices

其中的nextcloud-app-1是nextcloud镜像的name,请按实际情况修改。

输出结果类似于:

Check indices of the share table.
Check indices of the filecache table.
Check indices of the twofactor_providers table.
Check indices of the login_flow_v2 table.
Check indices of the whats_new table.
Check indices of the cards table.
Check indices of the cards_properties table.
Check indices of the calendarobjects_props table.
Check indices of the schedulingobjects table.
Check indices of the oc_properties table.
Adding properties_pathonly_index index to the oc_properties table, this can take some time...
oc_properties table updated successfully.
Check indices of the oc_jobs table.
Adding job_lastcheck_reserved index to the oc_jobs table, this can take some time...
oc_properties table updated successfully.
Check indices of the oc_direct_edit table.
Adding direct_edit_timestamp index to the oc_direct_edit table, this can take some time...
oc_direct_edit table updated successfully.
Check indices of the oc_preferences table.
Adding preferences_app_key index to the oc_preferences table, this can take some time...
oc_properties table updated successfully.
Check indices of the oc_mounts table.

升级Nextcloud后可能会出现类似报错,其要求运行db:convert-filecache-bigint进行检测,用法也是类似的:

docker exec -u 33 nextcloud-app-1 /var/www/html/occ -n db:convert-filecache-bigint &

无法预览常见格式的文件

参考Configuration Parameters — Nextcloud latest Administration Manual latest documentation

适合内存和CPU性能较强的机器。 小型VPS里一般不推荐开启。

有时候Nextcloud可能无法正确预览MOV文件(通常是iPhone/iPad等苹果设备生成的视频格式),这对于我们预览同步到Nextcloud的手机视频非常不方便。解决方法如下:

首先,我们在Nextcloud容器内部安装ffmpeg

# nextcloud-app-1要根据实际情况作修改
docker exec -it --user root nextcloud-app-1 /bin/bash -c 'apt update && apt install -y ffmpeg'

# docker exec -it --user root nextcloud-app-1 /bin/bash -c 'apt-get --purge remove ffmpeg -y && apt-get autoremove -y'

其中的nextcloud-app-1是nextcloud镜像的name,请按实际情况修改。

同时,修改config.php文件:

vim $work/app/config/config.php

在末尾添加以下内容:

'enable_previews' => true,
'enabledPreviewProviders' =>
array (
    0 => 'OC\\Preview\\Movie',
    1 => 'OC\\Preview\\PNG',
    2 => 'OC\\Preview\\JPEG',
    3 => 'OC\\Preview\\GIF',
    4 => 'OC\\Preview\\BMP',
    5 => 'OC\\Preview\\MP4',
    6 => 'OC\\Preview\\TXT',
    7 => 'OC\\Preview\\MOV',
    8 => 'OC\\Preview\\WebP',
  ),

这里我其实添加了好多常见的文件格式。等容器内部的ffmpeg安装完成后,cd $work && docker-compose restart即可。对于WebP,记得写OC\\Preview\\WebP而不能写OC\\Preview\\WEBP

如果你使用了docker-compose down,之后再次上线Nextcloud后要重新安装ffmpeg。在docker镜像里面安装新软件的持久化是个老大难问题了。除了构建自己的docker镜像,暂未有比较优雅的解决方式。因此推荐这一步在Nextcloud比较平稳运行的时候运行。

另外,我发现用ffmpeg生成预览图的过程是纯CPU计算。我觉得应该有一些方法可以使用核显进行解码和转码,不过暂时还没有太多头绪。

MaxRequestWorkers

在nextcloud 26.0.0+后该问题比较明显。设置较大的值后nextcloud响应速度显著提升!

在频繁请求nextcloud的时候,可能会出现这样的error:

[mpm_prefork:error] [pid 1] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

该错误出现后将导致nextcloud无法正常访问。原因是Apache服务器已达到了同时处理请求的最大线程数。我们可以手动调高相应的数值。

首先,我们进入容器shell:

# nextcloud-app-1要根据实际情况作修改
docker exec -it nextcloud-app-1 /bin/bash

查看哪些apache配置文件包含MaxRequestWorkers字符:

grep -rn "MaxRequestWorkers" /etc/apache2/ 
# grep -rn "MaxClients" /etc/apache2/ 

输出类似于:

/etc/apache2/mods-available/mpm_worker.conf:9:# MaxRequestWorkers: maximum number of threads
/etc/apache2/mods-available/mpm_worker.conf:18: MaxRequestWorkers         150
/etc/apache2/mods-available/mpm_event.conf:6:# MaxRequestWorkers: maximum number of worker threads
/etc/apache2/mods-available/mpm_event.conf:14:  MaxRequestWorkers         150
/etc/apache2/mods-available/mpm_prefork.conf:5:# MaxRequestWorkers: maximum number of server processes allowed to start
/etc/apache2/mods-available/mpm_prefork.conf:12:        MaxRequestWorkers         150

因此我们需要在/etc/apache2/mods-available/mpm_worker.conf/etc/apache2/mods-available/mpm_event.conf/etc/apache2/mods-available/mpm_prefork.conf中修改MaxRequestWorkers参数。大家直接用vim修改即可,这里就不展示了。记得先安装vim:

apt update && apt install vim -y

默认值是150,这也太小了Σ( ° △ °|||)︴ 我直接改为150000

最后,输入exit退出容器shell。重启容器即可生效:

docker-compose restart

值得注意的是,如果你使用了docker-compose down && docker-compose up -d,这些设置应该会初始化的。真麻烦啊 Σ( ° △ °|||)︴

无法上传>512M的文件

参考:Uploading big files > 512MB — Nextcloud latest Administration Manual latest documentation

Nextcloud fails to upload large files – ℹ️ Support – Nextcloud community

默认情况下,Nextcloud仅支持单个大小≤512M的文件上传。如果你有上传很大文件的需求,你应该设置.user.ini文件,它在Nextcloud的根目录里,是一个隐藏文件。你可以通过ls -lha查看:

MobaXterm1_CHS_D3gzPBeXlR

添加以下项目即可:

upload_max_filesize=16G
post_max_size=16G
max_input_time=3600
max_execution_time=3600
request_terminate_timeout=17200

这等同于在.htaccess文件里的mod_php.c中添加:

php_value upload_max_filesize 16G
php_value post_max_size 16G
php_value max_input_time 3600
php_value max_execution_time 3600
php_value request_terminate_timeout 17200

upload_max_filesize指定了单个上传文件的最大字节数。post_max_size指定了通过POST方法提交的整个请求的最大字节数,它包括请求头、请求主体和所有的POST数据。如果上传的文件超过限制,PHP会返回一个错误。值得注意的是,post_max_size的值应该大于或等于upload_max_filesize的值。由于我的业务中涉及一些大视频的传送,我定义了16G;你也可以根据自己的使用习惯自定义这些参数。完成设置后,docker-compose重启nextcloud即可生效

测试ing:

docker exec -it nextcloud4-fpm-app cat /usr/local/etc/php/php.ini

/usr/local/etc/php

新建$work/custom/php.ini,添加以下内容:

upload_max_filesize=16G
post_max_size=16G
max_input_time=3600
max_execution_time=3600
request_terminate_timeout=17200

修改权限:

sudo chown 33:33 $work/custom/php.ini

做好映射:

version: '3'
services:
  ...
  app:
    image: nextcloud:fpm-bensz
    container_name: nextcloud4-fpm-app
    restart: unless-stopped
    volumes:
      - ./app:/var/www/html:z
      - ./custom/www.conf:/usr/local/etc/php-fpm.d/www.conf
      # 加上这一项
      - ./custom/php.ini:/usr/local/etc/php/php.ini
    environment:
      - MYSQL_HOST=db
      - REDIS_HOST=cache
    env_file:
      - db.env
    depends_on:
      - db
      - cache
    networks:
      - default
  ...
networks:
  default:
    name: nextcloud4-fpm

上传速度太慢

这是一个被广泛报道的缺陷。根据Very slow upload speed : NextCloudProximus88的建议,挂载WebDav上传才是Nextcloud上传的正确打开方式

如下图,我是直接通过RaiDrive Nextcloud WebDav(具体见教程“Docker系列 深度使用nextcloud(九) 硬盘挂载”)复制到Nextcloud里;在相同的情况下,使用浏览器上传只有不到500kb/s的速度:

explorer_Es1LE9qXpV

使用Win10内置的WebDav应用速度更快,可达800MB/s +(2.5Gbps带宽)。浏览器上传速度慢的机制和解决方案暂不明确,欢迎在评论区说出你的解决方案喔!

将默认窗口从Dashboard变成File

有不少人对Nextcloud的Dashboard非常不满(详见该issue),我就是其中之一。因为这个界面过于花哨而不实用。这里我们简单设置一下config.php,从而将默认窗口从Dashboard变为File窗口:

msedge_PYcE7uLsAk

只要在config.php中添加一条命令即可:

'defaultapp' => 'files',

image-20230730114106155

这里的files是app的名字,你可以通过ls $work/app/apps查看:

MobaXterm1_CHS_Fmtv4bDMJn

或者直接点开界面,后面有个名字:

msedge_NXPlEgWw7D

Beta: Redis测试

个人推测,不知道没有redis的时候是否会这样

这里有一个简单的方法可以测试Redis有没有生效。你在上传很多图片后,可以在此页面快速往下滑动:

image-20220424195617202

与此同时,可调用htop观察:

image-20220424195806169

可看到数据被大量地调用。同时可以发现页面的刷新还是蛮快的。

小结

对于VPS用户来说,Nextcloud的安装非常容易,基本上没有什么难度。对于NAS用户来说就比较折腾;但是,如果成功安装,Nextcloud就非常有用了!

另外,我觉得非443端口使用的时候Nextcloud慢吞吞的。不知道是不是自己的NAS配置太差(蜗牛星际)。我在VPS上用还是非常流畅的。希望有NAS用户安装Nextcloud时给多些反馈!

关于对Nextcloud的深度使用可以看我后续的更新。敬请期待喽!

附:Nextcloud团队的合体照

image-20220424200130655

参考资料

拓展阅读

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

感谢Faconhost的友情赞助 (ฅ´ω`ฅ) 本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |

评论

  1. lemmo
    Macintosh Chrome 112.0.0.0
    2 年前
    2023-4-15 20:11:36

    已经使用Nextcloud在我的NAS上四年多了了,一直非常稳定。有很多实用的功能,通过WebDav同步软件数据(如Ob和Zotero),同步Calibre库,以及方便的文件分享功能,非常Nice

    • 博主
      lemmo
      Windows Edge 112.0.1722.39
      2 年前
      2023-4-15 20:48:41

      是呀,因为nextcloud太重要了,所以我专门为它写了系列教程 (ฅ´ω`ฅ) 而且,还远不止这些可以折腾的东西呢!

  2. cye
    Macintosh Chrome 110.0.0.0
    2 年前
    2023-2-26 12:25:54

    无意中发现这里你用到了/.well-known (☆ω☆)。还记得这个文件夹是怎么创建的吗?

    • 博主
      cye
      Windows Edge 110.0.1587.56
      2 年前
      2023-2-26 12:27:28

      其实我并没有特意去创建这个文件(夹)。我只是看到有一个warning message,所以就去解决它 ヾ(≧∇≦*)ゝ

    • 博主
      cye
      Windows Edge 110.0.1587.56
      2 年前
      2023-2-26 12:31:36

      这个过程似乎和/.well-known的创建也没有关系

    • 博主
      cye
      Windows Edge 114.0.1823.37
      1 年前
      2023-6-08 12:31:46

      大佬,Nextcloud-fpm + Nginx折腾出来了,感兴趣可以看: 《Docker系列 搭建nextcloud-fpm + nginx网络服务器

      • cye
        Bensz
        Windows Chrome 114.0.0.0
        1 年前
        2023-6-08 12:41:16

        好的!!感谢提醒

  3. Macintosh Edge 109.0.1518.78
    2 年前
    2023-2-08 22:50:40

    干货满满,非常感谢

    • 博主
      Anyview
      Windows Edge 109.0.1518.78
      2 年前
      2023-2-08 22:52:29

      谢谢鼓励 ヾ(≧∇≦*)ゝ

  4. kbqian
    Linux Firefox 108.0
    2 年前
    2023-1-11 18:05:44

    刚刚切换到LINUX操作环境,感觉本就不熟悉的电脑更陌生了

    • 博主
      kbqian
      Windows Edge 108.0.1462.76
      2 年前
      2023-1-11 23:15:12

      学习地图里面的Linux系列就好了,慢慢来,多打打命令,就熟悉的了

  5. Windows Edge 104.0.1293.47
    2 年前
    2022-8-08 22:36:45

    也是在咕咕博客摸过来的,感谢博主这么详细的教程,之前一直想折腾一个但是怕用 Docker 会比较麻烦,看完这篇有信心来试一下哈哈哈,再次感谢!

    • 博主
      Leon
      iPhone Chrome 103.0.5060.63
      2 年前
      2022-8-09 6:42:13

      有用就好了,如果安装有啥问题可以加群提问

  6. aaa
    Windows Chrome 92.0.4515.105
    2 年前
    2022-6-22 14:40:22

    我是在咕咕鸽上看到评论才过来的。之前百度谷歌翻了好些看不见你

    • 博主
      aaa
      Windows Chrome 102.0.0.0
      2 年前
      2022-6-22 14:42:17

      其实我这个文章也在知乎、头条、简书和CSDN转发过了,不过可能权重确实不高,你搜索不到(~ ̄▽ ̄)~ 这也是没有办法的事,慢慢来吧 有其它问题可以加Telegram群讨论 今天才有个大佬吐槽Nextcloud不好用的。。。

  7. aaa
    Windows Chrome 92.0.4515.105
    2 年前
    2022-6-22 14:36:40

    感谢大佬。我也是昨天自己试出来非443,80端口转nginx。
    之前反代缺少端口号快把我给气死了。网上也找不到。你这篇文章在百度和谷歌上权重很低。希望博主出一期哔哩哔哩视频啦

    • 博主
      aaa
      Windows Chrome 102.0.0.0
      2 年前
      2022-6-22 14:38:55

      能成功就行,哈哈!Nextcloud差不多是这样吧!虽然Nextcloud能玩的花样挺多,但一般我只是将它当做普通的云盘来用。

  8. Boris WU
    Macintosh Edge 104.0.1278.2
    2 年前
    2022-6-13 19:31:08

    谢谢博主,根据流程走下来,非常的顺利!

    • 博主
      Boris WU
      Windows Chrome 102.0.5005.63
      2 年前
      2022-6-13 19:46:04

      嗯嗯,加油喔!有什么问题也可以加群讨论哈!

      • Boris WU
        Bensz
        Macintosh Edge 104.0.1278.2
        2 年前
        2022-6-13 19:47:42

        请问如何加群?

      • 博主
        Boris WU
        Windows Chrome 102.0.5005.63
        2 年前
        2022-6-13 19:48:55

        https://t.me/benszhub 目前只开放Telegram群 不过没啥人 比较安静 哈哈!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇