Nextcloud

来自 ArchWiki
(重定向自 OwnCloud)

Nextcloud 是一套客户端-服务器软件,它(通过所谓的 应用)允许各种共享、协作和通信,例如:

Nextcloud 是开源的,并且基于开放标准。数据主权是一个很大的优势,也就是说,通过您自己的 Nextcloud 实例,您可以摆脱专有(且可能不可信)的服务,如 Dropbox、Office 365 或 Google Drive。

根据您的需求,Nextcloud 可以从单板计算机(如 Raspberry Pi)一直部署到为数百万用户提供服务的大型数据中心。凭借精心设计的授权方案和联邦选项(连接离散实例),Nextcloud 非常适合在企业环境中使用。

Nextcloud 是 ownCloud 的一个分支。有关 历史,请参阅维基百科。

设置概览

Nextcloud 的完整安装(至少)包括以下组件

一个 Web 服务器,搭配一个 应用服务器,在其上运行使用 数据库Nextcloud(即 PHP 代码)。

本文将涵盖 MariaDB/MySQL 和 PostgreSQL 作为数据库,以及以下 Web 服务器和应用服务器的组合

  • nginx → uWSGI(加上 uwsgi-plugin-php)
  • nginx → FPM,
  • Apache HTTP 服务器(使用 mod_proxy_uwsgi)→ uWSGI(加上 uwsgi-plugin-php)
  • Apache HTTP 服务器(使用 mod_proxy_fcgi)→ FPM

Nextcloud 软件包符合 Web 应用程序软件包指南。 除此之外,这还强制要求 Web 应用程序以专用用户运行 - 在本例中为 nextcloud。 这是应用服务器在这里发挥作用的原因之一。 出于完全相同的原因,不再可能通过 php-apache 在 Apache 进程中直接执行 Nextcloud 的 PHP 代码。

安装

注意: 软件包 nextcloud(通过依赖元软件包 php-interpreter)提供了在 php 或软件包 php-legacy 之上构建 Nextcloud 安装的选择。 强烈建议选择 php-legacy 以确保安全(并让您安心)。 有关详细信息,请参阅 迁移到 php-legacy。 在本文的其余部分,我们假设使用 php-legacy 进行安装。

安装 nextcloud 软件包。 当询问时,选择 php-legacy 作为您的 PHP 版本。 这将引入相当多的依赖软件包。 大部分 必需的 PHP 扩展 将以这种方式处理。 此外,您必须安装 php-legacy-gd(最好作为依赖软件包,使用 pacman 选项 --asdeps)。

建议同时安装以下软件包

(也使用 --asdeps)。 其他可选依赖项将在稍后根据您的具体设置(例如,您选择的数据库)进行介绍。

请注意,一些模块(即 bcmathexifgmpintlsysvsem)随附 php-legacy。 因此,这些模块不需要显式安装。

配置

PHP

本指南不篡改 PHP 的中央配置文件 /etc/php-legacy/php.ini,而是将 Nextcloud 特定的 PHP 配置放在不会潜在干扰其他基于 PHP 的应用程序设置的位置。 这些位置是

  • /etc/webapps/nextcloudphp.ini 的专用副本(用于 occ 命令行工具和后台任务)。 这实际上是 php-legacy 软件包提供的原始 php.ini 的副本,其中包含一些 Nextcloud 特定的添加/修改。
  • 应用服务器配置中的相应设置。 这些将在关于应用服务器的部分中介绍。

/etc/php-legacy/php.ini 的副本复制到 /etc/webapps/nextcloud(或者更好的是,从 php-legacy 软件包 tarball 下的 /var/cache/pacman/pkg 中提取 php.ini)。 虽然不是绝对必要,但更改副本的所有权

# cp /etc/php-legacy/php.ini /etc/webapps/nextcloud
# chown nextcloud:nextcloud /etc/webapps/nextcloud/php.ini

在刚刚复制的裸 PHP 安装配置文件中,已经启用了 Nextcloud 文档 中列出的大部分必需的 PHP 模块。 此外,启用以下扩展

/etc/webapps/nextcloud/php.ini
extension=exif
extension=gd
extension=iconv
extension=intl
extension=sysvsem
; bcmath and gmp for passwordless login
extension=bcmath
extension=gmp
; sodium for the argon2 hashing algorithm
extension=sodium
; in case you installed php-legacy-imagick (as recommended)
extension=imagick

根据您要使用的数据库,启用相应的 pdo_xxxx 模块。 请参阅下面的 数据库

date.timezone 设置为您首选的时区,例如

/etc/webapps/nextcloud/php.ini
date.timezone = Europe/Berlin

将 PHP 的内存限制提高到至少 512MiB

/etc/webapps/nextcloud/php.ini
memory_limit = 512M

可选:为了提高安全性,配置 open_basedir。 这限制了 Nextcloud 的 PHP 代码可以读取和写入文件的位置。 经过验证的设置是

/etc/webapps/nextcloud/php.ini
open_basedir=/var/lib/nextcloud:/tmp:/usr/share/webapps/nextcloud:/etc/webapps/nextcloud:/dev/urandom:/usr/lib/php-legacy/modules:/var/log/nextcloud:/proc/meminfo:/proc/cpuinfo

根据您配置的其他扩展,您可能需要扩展此列表,例如,如果您选择 Redis,则为 /run/redis

此处无需配置 opcache,因为此 php.ini 仅由 occ 命令行工具和后台任务使用,即由短时运行的 PHP 进程使用。

Nextcloud

将以下条目添加到 Nextcloud 的配置文件

/etc/webapps/nextcloud/config/config.php
'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => 'cloud.mysite.com',
  ),    
'overwrite.cli.url' => 'https://cloud.mysite.com/',
'htaccess.RewriteBase' => '/',

调整给定的示例主机名 cloud.mysite.com。 如果您的 Nextcloud 安装将通过子文件夹访问(例如 https://www.mysite.com/nextcloud),则必须相应地修改 overwrite.cli.urlhtaccess.RewriteBase

系统和环境

为了确保 occ 工具使用 Nextcloud 特定的 php.ini,请设置环境变量 NEXTCLOUD_PHP_CONFIG

$ export NEXTCLOUD_PHP_CONFIG=/etc/webapps/nextcloud/php.ini

также 添加此行到您的 .bashrc(或 .bash_profile)以使此设置永久生效。

作为隐私和安全预防措施,创建会话数据的专用目录

# install --owner=nextcloud --group=nextcloud --mode=700 -d /var/lib/nextcloud/sessions

数据库

MariaDB/MySQL 是 Nextcloud 的规范选择。

MySQL 或 MariaDB 数据库是推荐的数据库引擎。[1]

关于 Nextcloud 数据库的大部分信息都与 MariaDB/MySQL 有关。 Nextcloud 开发人员承认对其他数据库的 专业知识较少

PostgreSQL 据说提供更好的性能,并且与 MariaDB/MySQL 相比,总体而言,怪癖更少。 SQLite 主要支持测试/开发安装,不建议用于生产环境。 支持的数据库列表 还包含 Oracle 数据库。 本文将不介绍此产品。

MariaDB / MySQL

由于 MariaDB 自 2013 年以来一直是 Arch Linux 中的默认 MySQL 实现[2],因此本文仅提及 MariaDB。

如果您想在与 Nextcloud 安装相同的主机上运行数据库,请 配置启动 mariadb(如果您尚未这样做)。 有关详细信息,请参阅相应的 文章。 不要忘记使用 mariadb-install-db 初始化 MariaDB。 为了提高安全性,建议将 MariaDB 配置为 仅侦听本地 Unix 套接字

/etc/my.cnf.d/server.cnf
[mysqld]
skip_networking

Nextcloud 自己的文档 建议 将事务隔离级别设置为 READ-COMMITTED。 当您期望高负载和许多并发事务时,这一点尤其重要。

/etc/my.cnf.d/server.cnf
[mysqld]
transaction_isolation=READ-COMMITTED

另一个设置 binlog_format=ROW 的建议已过时。 最近 MariaDB 版本中的默认 MIXED 至少与推荐的 ROW 一样好。 在任何情况下,此设置仅在应用复制时才相关。

使用数据库用户 root 启动 CLI 工具 mysql。 (默认密码为空,但希望您尽快更改它。)

$ mysql -u root -p

使用以下命令为 Nextcloud 创建用户和数据库

CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'db-password';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on nextcloud.* to 'nextcloud'@'localhost';
FLUSH privileges;

db-password 是您必须选择的 DB 用户 nextcloud 的实际密码的占位符。)使用 \q 退出该工具。

注意: MariaDB 对 UTF8 的理解存在缺陷,导致无法存储代码点为 0x10000 及以上的任何字符(例如表情符号)。 他们在 5.5 版本中通过引入一种名为 utf8mb4 的新编码“修复”了此问题。 底线:永远不要使用 MariaDB 的 utf8,始终使用 utf8mb4。 如果您需要迁移,请参阅 [3]

因此,您已决定使用 MariaDB 作为 Nextcloud 安装的数据库,您必须启用相应的 PHP 扩展

/etc/webapps/nextcloud/php.ini
extension=pdo_mysql

不需要进一步的配置(与 Nextcloud 的 管理员手册 中给出的信息相反)。

现在使用以下命令设置 Nextcloud 的数据库架构

$ occ maintenance:install \
    --database=mysql \
    --database-name=nextcloud \
    --database-host=localhost:/run/mysqld/mysqld.sock \
    --database-user=nextcloud \
    --database-pass=db-password \
    --admin-pass=admin-password \
    --admin-email=admin-email \
    --data-dir=/var/lib/nextcloud/data

请注意占位符(例如 db-password)并将它们替换为适当的值。 此命令假设您在与 Nextcloud 相同的主机上运行数据库。 输入 occ help maintenance:install 并查看 Nextcloud 的 文档 以获取其他选项。 有关此工具的 Arch 特定详细信息,请参阅 使用 "occ" 命令行工具

PostgreSQL

有关 PostgreSQL 的详细信息,请查阅相应的 文章。 如果您想在与 Nextcloud 安装相同的主机上运行数据库,请 配置启动 postgresql(如果您尚未这样做)。 在这种情况下,为了提高安全性,建议将 PostgreSQL 配置为 仅侦听本地 UNIX 套接字

/var/lib/postgres/data/postgresql.conf
listen_addresses = ''

尤其不要忘记使用 initdb 初始化您的数据库。 完成此操作后,启动 PostgreSQL 的 CLI 工具 psql 并创建数据库用户 nextcloud 和同名的数据库

[postgres]$ psql
CREATE USER nextcloud WITH PASSWORD 'db-password';
CREATE DATABASE nextcloud TEMPLATE template0 ENCODING 'UNICODE';
ALTER DATABASE nextcloud OWNER TO nextcloud;
GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
\q

db-password 是您必须选择的数据库用户 nextcloud 的密码的占位符。)

安装附加软件包 php-legacy-pgsql 作为依赖项(pacman 选项 --asdeps)并在 /etc/webapps/nextcloud/php.ini 中启用相应的 PHP 扩展

/etc/webapps/nextcloud/php.ini
extension=pdo_pgsql

现在使用以下命令设置 Nextcloud 的数据库架构

$ occ maintenance:install \
    --database=pgsql \
    --database-name=nextcloud \
    --database-host=/run/postgresql \
    --database-user=nextcloud \
    --database-pass=db-password \
    --admin-pass=admin-password \
    --admin-email=admin-email \
    --data-dir=/var/lib/nextcloud/data

请注意占位符(例如 db-password)并将它们替换为适当的值。 此命令假设您在与 Nextcloud 相同的主机上运行数据库。 输入 occ help maintenance:install 并查看 Nextcloud 的 文档 以获取其他选项。 有关此工具的 Arch 特定详细信息,请参阅 使用 "occ" 命令行工具

应用服务器

有两种流行的应用服务器可用于处理 PHP 代码:uWSGIFPMFPM 专门用于 PHP。 Web 服务器和 FPM 之间使用的协议是 fastcgi。 该工具的 文档 仍有改进空间。 另一方面,uWSGI 可以通过语言特定的插件为用 少数几种语言 编写的代码提供服务。 使用的协议是 uwsgi(小写)。 该工具的 文档非常全面 - 尽管大量的文档可能会让人感到困惑和笨拙。

uWSGI

uWSGI 有其自己的 文章。 可以在那里找到许多有用的信息。 安装 uwsgi 和插件 uwsgi-plugin-php-legacy - 最好作为依赖项,即使用 --asdeps。 要使用 uWSGI 运行 Nextcloud 的代码(或在其中运行),您必须配置一个 uWSGI 特定的配置文件 (nextcloud.ini) 并定义一个 systemd 服务。

警告: 必须提到的是,uWSGI 及其 PHP 插件的维护最近一直很稀疏[4]。 这已经引起了 问题,这些问题只能通过 Arch Linux 软件包的维护者(而不是上游)修补 uWSGI 代码来解决。

nextcloud.ini

软件包 nextcloud 已在正确的位置 /etc/uwsgi/nextcloud.ini 中包含了一个示例配置文件。 在几乎所有情况下,您都必须根据您的要求和设置调整此文件。 查找 包含大量注释更改的版本(与软件包的版本相比)。 它假设为私人使用进行简单的 Nextcloud 安装(即负载适中)。

通常,使启用的扩展、特定于扩展的设置和 open_basedir/etc/webapps/nextcloud/php.ini 保持同步(opcache 除外)。

提示:/etc/uwsgi/nextcloud.ini 的更改可能会变得非常广泛。 如果软件包 nextcloud 提供的原始文件发生更改,则在软件包更新期间将创建名为 nextcloud.ini.pacnew 的文件。 为了更好地跟踪后一个文件中的更改并将它们应用到 /etc/uwsgi/nextcloud.ini,可以应用以下方法
  • 创建软件包提供的文件的副本(例如,通过从软件包中提取),并将其存储为 nextcloud.ini.package
  • 如果软件包 nextcloud 的更新生成了 nextcloud.ini.pacnew,您可以使用 diff nextcloud.ini.package nextcloud.ini.pacnew 识别更改。
  • 根据更改是否对您的版本有意义,有选择地将更改应用于您的 nextcloud.ini
  • nextcloud.ini.pacnew 移动到 nextcloud.ini.package 上。

uWSGI 服务

软件包 uwsgi 提供了一个模板单元文件 (uwsgi@.service)。 实例 ID(此处为 nextcloud)用于选择正确的配置文件。 启用启动 uwsgi@nextcloud.service

如果您启动了多个(例如 2 个以上)类似的服务,并且感觉这是一种资源浪费,您可以考虑使用 emperor 模式

FPM

如果您选择使用 FPM 作为您的应用服务器,请安装 php-legacy-fpm - 最好作为依赖软件包 (--asdeps)。

配置包括与 FPM 服务的所有应用程序相关的 php.ini 副本和特定于应用程序(此处为 Nextcloud)的所谓池文件。 最后,您必须调整 systemd 服务文件。

php-fpm.ini

如前所述,本文避免修改 /etc/php-legacy/php.ini 中的 PHP 中央配置。 而是创建一个 FPM 特定的副本。

# cp /etc/php-legacy/php.ini /etc/php-legacy/php-fpm.ini

确保它由 root 拥有且仅由 root 可写 (-rw-r--r-- 1 root root ... php-fpm.ini)。 启用 op-cache,即取消注释行

/etc/php-legacy/php-fpm.ini
zend_extension=opcache

并将以下参数放在现有行 [opcache] 下方

/etc/php-legacy/php-fpm.ini
opcache.enable = 1
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 128
opcache.save_comments = 1
opcache.revalidate_freq = 1
警告: 不要尝试通过 php_value[...]php_flag[...] 将这些设置放在池文件中。 您的 FPM 进程将在第一个请求时持续崩溃。

nextcloud.conf

接下来,您必须为 FPM 创建一个所谓的池文件。 它负责为 Nextcloud 应用程序生成专用的 FPM 进程。 创建文件 /etc/php-legacy/php-fpm.d/nextcloud.conf - 您可以使用此 功能版本 作为起点。

再次确保此池文件由 root 拥有且仅由 root 可写(即 -rw-r--r-- 1 root root ... nextcloud.conf)。 根据是否配置了访问日志(上述示例 nextcloud.conf 中已配置),您可能需要创建相应的目录(此处为 /var/log/php-fpm-legacy/access)。 根据您的喜好调整或添加设置(尤其是 pm...php_value[...]php_flag[...])。 设置 php_value[...]php_flag[..] 必须与 /etc/webapps/nextcloud/php.ini 中的相应设置一致(但不是 /etc/php-legacy/php-fpm.ini)。

通过 php_value[...]php_flag[...] 完成的设置也可以在 php-fpm.ini 中指定。 但请注意,php-fpm.ini 中的设置适用于 FPM 服务的所有应用程序。

提示: 软件包 php-legacy-fpm 附带自己的池文件 www.conf,此处几乎没有用处。 摆脱它的一个好方法是将其重命名为 www.conf.package 并创建一个仅包含注释行(以分号开头的行)的文件 www.conf。 这样,www.conf 就变成了空操作。 在安装新版本的 php-legacy-fpm 期间,它也不会被覆盖。 而是创建文件 www.conf.pacnew。 您可以将其与 www.conf.package 进行比较,以查看池文件中是否有任何重大更改,您可能需要在 nextcloud.conf 中重现这些更改。 不要忘记在此过程结束时将 www.conf.pacnew 重命名为 www.conf.package

Systemd 服务

FPM 作为 systemd 服务运行。 您必须修改服务配置才能运行 Nextcloud。 这最好通过 drop-in 文件 来实现

/etc/systemd/system/php-fpm-legacy.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/php-fpm-legacy --nodaemonize --fpm-config /etc/php-legacy/php-fpm.conf --php-ini /etc/php-legacy/php-fpm.ini
ReadWritePaths=/var/lib/nextcloud
ReadWritePaths=/etc/webapps/nextcloud/config
  • 它将 ExecStart 行替换为使用上一节中介绍的 php-fpm.ini 的启动命令。
  • 目录 /var/lib/nextcloud/etc/webapps/nextcloud/config(以及下面的所有内容)变为可写。 原始服务定义中的 ProtectSystem=full 导致 /usr/boot/etc 以只读方式挂载到 FPM 进程。
  • 如果您想使用 硬件转码(例如在 memories 应用中),您需要显式允许访问您的图形设备,因为 PrivateDevices=true 会向 FPM 进程隐藏任何设备。 例如,将 BindPaths=/dev/dri/renderD128DeviceAllow=/dev/dri/renderD128 rw 添加到 drop-in 文件允许使用正确配置的 Intel iGpu。

不要忘记 启用启动 服务 php-fpm-legacy

保持 /etc 目录整洁

Nextcloud 软件包无条件创建 uWSGI 配置文件 /etc/uwsgi/nextcloud.ini。 当然,当您运行 FPM 而不是 uWSGI 时,它没有用处(并且没有任何危害)。 如果您仍然想摆脱它,只需将以下 NoExtract 行添加到 /etc/pacman.conf

/etc/pacman.conf
# uWSGI configuration that comes with Nextcloud is not needed
NoExtract = etc/uwsgi/nextcloud.ini

Web 服务器

您可以选择的 Web 服务器有很多。 无论您最终选择哪个选项,您都必须记住,Nextcloud 应用程序需要使用其自己的系统用户 nextcloud 运行。 因此,您需要将您的请求转发到上述应用服务器之一。

nginx

nginx 的配置超出了本文的范围。有关更多信息,请参阅相关的 文章。另请查阅 Nextcloud 的文档,其中有详细的配置说明。如何将此代码片段包含到您的 nginx 配置中取决于您自己。一种常见的方法是使用目录 /etc/nginx/sites-available/etc/nginx/sites-enabled 来分隔不同服务器(又名虚拟主机)的配置。有关详细信息,请参阅 Nginx#管理服务器条目

如果使用上面链接的 Nextcloud 文档中的示例 nginx 配置,则根目录应更改为

cloud.mysite.com.conf
  root /usr/share/webapps/nextcloud;

upstream php-handler { ... } 的使用不是必需的。只需在 location 块中指定 fastcgi_pass unix:/run/php-fpm-legacy/nextcloud.sock;,该块用于处理将带有 PHP URI 的请求转发到应用程序服务器。当使用 uWSGI 而不是 FPM 时,请将此 location 块替换为

cloud.mysite.com.conf
location ~ \.php(?:$|/) {
    include uwsgi_params;
    uwsgi_modifier1 14;
    # Avoid duplicate headers confusing OC checks
    uwsgi_hide_header X-Frame-Options;
    uwsgi_hide_header X-XSS-Protection;
    uwsgi_hide_header X-Content-Type-Options;
    uwsgi_hide_header X-Robots-Tag;
    uwsgi_hide_header X-Download-Options;
    uwsgi_hide_header X-Permitted-Cross-Domain-Policies;
    uwsgi_pass unix:/run/uwsgi/nextcloud.sock;
}

您可能需要调整的事项(非详尽列表)

  • 您的服务器名称 (server_name 子句 2x),即您的 Nextcloud 安装可通过 URL 访问的服务器部分。
  • 您用于 SSL / TLS 的证书和密钥的名称。
  • 您是否以及在何处写入访问日志。
  • Certbot(或任何其他 ACME 客户端)将放置域名验证质询的位置。此处使用 alias 而不是 try_files 可能更合适。
  • 用于访问您的 Nextcloud 安装的路径。(URL 中服务器名称和端口部分右侧的部分。)
  • 您正在使用的应用程序服务器(uWSGI 或 FPM),即 nginx 如何以及在何处传递需要触发某些 PHP 代码的请求。(见上文。)
  • 配置 OCSP stapling

无需安装任何其他模块,因为 nginx 本身就支持 FastCGI 和 uwsgi 协议。

Apache HTTP 服务器

在关于 Apache HTTP 服务器 的文章中找到大量有用的信息。Nextcloud 的文档有一些 示例配置,也可以在 /usr/share/doc/nextcloud/apache.example.conf 中找到。两者都隐式地依赖于 mod_php,但它已无法再使用。需要应用 mod_proxy_fcgimod_proxy_uwsgi

有关如何将 Apache 与 FPM 集成的信息,请参阅本 wiki 中的 Apache HTTP 服务器。uWSGI 的文档有一些关于如何通过 uWSGI 和 mod_proxy_uwsgi 将 Apache 与 PHP 集成 的信息。请注意,Apache 软件包附带了 mod_proxy_fcgimod_proxy_uwsgi 模块。它们需要根据需要加载。

运行 Nextcloud 需要以下 Apache 模块

/etc/httpd/conf/httpd.conf
# these are already loaded in a standard Apache installation
LoadModule headers_module modules/mod_headers.so
LoadModule env_module modules/mod_env.so
LoadModule dir_module modules/mod_dir.so
LoadModule mime_module modules/mod_mime.so
LoadModule setenvif_module modules/mod_setenvif.so

# these need to be uncommented explicitly
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule proxy_module modules/mod_proxy.so

# either this one in case you use FPM
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
# or this one in case you opt for uWSGI
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so

另请取消注释以下指令以引入 TLS 配置参数

/etc/httpd/conf/httpd.conf
Include conf/extra/httpd-ssl.conf

有关如何优化 TLS 配置的详细信息,请查阅 Mozilla 的 SSL 配置器

根据您希望如何访问 Nextcloud 安装,请参阅以下两个示例配置文件

  • 如果您的 Nextcloud 安装通过专用主机名访问(例如 https://cloud.mysite.com/),请将 片段放入 /etc/httpd/conf/extra/httpd-vhosts.conf
  • 如果您的 Nextcloud 安装位于您网站的子文件夹中(例如 https://www.mysite.com/nextcloud/),请将 片段放入您的 /etc/httpd/conf/httpd.conf 中。

当然,您必须根据您的具体设置调整这些示例配置文件。当您使用 uWSGI 时,将 SetHandler 指令替换为 SetHandler "proxy:unix:/run/uwsgi/nextcloud.sock|uwsgi://nextcloud/"

Nextcloud 软件包附带一个 .htaccess 文件,该文件已经处理了大量的重写和标头内容。运行 occ maintenance:update:htaccess 以调整此文件。/etc/webapps/nextcloud/config/config.php 中的参数 htaccess.RewriteBase 对此至关重要。

后台作业

Nextcloud 需要定期运行某些任务。有关详细信息,请参阅 Nextcloud 的 文档。设置这些后台作业的最简单(也是最可靠)的方法是使用 nextcloud 已经安装的 systemd 服务和计时器单元。服务单元需要进行一些调整,以便作业使用正确的 PHP ini 文件(而不是全局 php.ini)。创建一个 drop-in 文件 并添加

/etc/systemd/system/nextcloud-cron.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/php-legacy -c /etc/webapps/nextcloud/php.ini -f /usr/share/webapps/nextcloud/cron.php

之后,启用启动 nextcloud-cron.timer(不是服务)。

按照 文档 的建议,添加参数

/etc/webapps/nextcloud/config/config.php
....
'maintenance_window_start' => 0,
....

到 Nextcloud 的配置文件。该值是 UTC 时间中一天的小时,定义了 4 小时窗口的开始时间。只需要每天运行一次的耗时作业将在此时间范围内安排,即在工作时间之外。

警告: 不要尝试安装和使用 nextcloud-systemd-timersAUR。它已过时且未维护。

内存缓存

Nextcloud 的 文档 建议应用某种内存对象缓存以显着提高性能。

注意: 请注意,push notify(Nextcloud 服务,它用服务器通知替换客户端轮询,从而大大减少同步延迟)依赖于 Redis

APCu

安装 php-legacy-apcu(作为依赖项 --asdeps)。在相关配置文件中启用扩展。这些文件是

  • /etc/webapps/nextcloud/php.ini,供 occ 命令和后台作业使用,以及
  • 根据您使用的应用程序服务器,可以是
    • uWSGI 情况下的 /etc/uwsgi/nextcloud.ini,或
    • FPM 情况下的 /etc/php-legacy/php-fpm.d/nextcloud.conf

/etc/webapps/nextcloud/php.ini 中添加以下行

/etc/webapps/nextcloud/php.ini
extension=apcu
apc.ttl=7200
apc.enable_cli = 1

(最好在 Module Settings 下面的某个位置)。

对于其他两个文件,激活 APCu 的设置已经到位,只需要取消注释即可。与 APCu 相关的另外两个配置参数也已存在。无需修改 /etc/php-legacy/php.ini/etc/php-legacy/conf.d/apcu.ini

重新启动您的应用程序服务器(而不是 Nextcloud 文档声称的 Web 服务器)。将以下行添加到您的 Nextcloud 配置文件

/etc/webapps/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',

Redis

如果您在本地(即与 Nextcloud 在同一主机上)运行此组件,请安装 php-legacy-igbinaryphp-legacy-redis(作为依赖项 --asdeps)。或者,Redis 服务器可以在不同的机器上运行。有关更多信息,请参阅 Nextcloud 的文档

注意: 并行使用 Redis 并不排除同时使用 APCu 作为本地缓存。实际上,Nextcloud 的文档建议这种设置。

在相关配置文件中启用所需的扩展 igbinaryredis。这些文件是

  • /etc/webapps/nextcloud/php.ini,供 occ 命令和后台作业使用,以及
  • 根据您使用的应用程序服务器,可以是
    • uWSGI 情况下的 /etc/uwsgi/nextcloud.ini,或
    • FPM 情况下的 /etc/php-legacy/php-fpm.d/nextcloud.conf

找到其他扩展已启用的现有部分,并添加与 igbinaryredis 对应的两行。

注意: 重要的是在 extension=redis 之前加载 extension=igbinary。否则,occ 将报告错误(/usr/lib/php-legacy/modules/redis.so: undefined symbol: igbinary_serialize)。

如果您在上述配置文件中指定了 open_basedir 选项,并在本地使用带有本地 Unix 套接字的 Redis,则必须扩展 PHP 允许读取和写入文件的目录列表。找到上述文件中相关的行,并添加包含 Redis 创建的本地 Unix 套接字的目录,例如 /run/redis

注意:#应用程序服务器 部分中提到的示例配置文件 nextcloud.ininextcloud.conf 已经启用了 open_basedir。因此,如果您使用其中一个文件的副本,则必须对其进行调整。

按如下方式扩展您的 Nextcloud 配置

/etc/webapps/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
     'host'     => '/run/redis/redis.sock',
     'port'     => 0,
     'dbindex'  => 0,
     'password' => '',
     'timeout'  => 1.5,
],

再次,根据需要调整 /run/redis/redis.sockdbindexpasswordtimeout 是可选的。

如果 Redis 在不同的机器上运行

/etc/webapps/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
     'host' => 'redis-host.mysite.com',
     'port' => 6379,
],

redis-host.mysite.com 只是一个占位符。根据您的实际设置进行调整。

安全加固

请参阅 Nextcloud 文档安全。Nextcloud 另外提供了一个 安全扫描器

同步

提示: 建议不要使用您的个人密码,而是为所有自动对您的 Nextcloud 服务器进行身份验证的软件使用所谓的应用程序令牌。这样,如果您怀疑某个程序中的凭据可能已泄漏,您只需要撤销这一个受影响的应用程序令牌 - 而不必更改您的个人密码并将此更改传播到所有存储它的位置。您可以在 Nextcloud 的 Web GUI 中的设置 > 安全设备和会话部分中生成新的应用程序令牌。

桌面

可以使用 nextcloud-client 软件包安装官方客户端。在 AUR 中提供了替代版本:nextcloud-client-gitAUR。请记住,不支持将 owncloud-client 与 Nextcloud 一起使用。

桌面客户端基本上将您桌面计算机的一个或多个目录与 Nextcloud 文件服务中的相应文件夹同步。它与您桌面的文件管理器(KDE Plasma 中的 Dolphin,Gnome 中的 Nautilus)很好地集成,显示代表同步和共享状态的覆盖层。每个文件的上下文菜单都有一个额外的条目Nextcloud,用于管理此文件的共享并获取公共或内部共享链接。Nextcloud 的文档有一个专门关于桌面客户端的

如果集成未按所述工作,请查阅 nextcloud-client 软件包的 可选依赖项。例如,Nautilus 需要 nautilus-python作为依赖软件包 安装。

注意: 桌面客户端提供一个指示同步状态的系统托盘图标[5],但 GNOME 没有提供开箱即用的系统托盘图标 API[6]。如果这是一个期望的功能,一种可能的解决方案是安装并启用 gnome-shell-extension-appindicator。有关更多信息,请参阅 GNOME#扩展

Thunderbird

自版本 102 以来,Thunderbird 完全支持 CalDAV 和 CardDAV - 甚至支持自动检测(即,您不必提供长 URL 来访问您的日历和地址簿)。有关详细信息,请参阅 Nextcloud 的 文档

使用 davfs2 挂载文件

如果您想使用 WebDAV 挂载 Nextcloud,请安装 davfs2AUR(如 davfs2 中所述)。

要挂载您的 Nextcloud,请使用

# mount -t davfs https://cloud.mysite.com/remote.php/dav/files/username/ /path/to/mount

您也可以在 /etc/fstab 中为此创建一个条目

/etc/fstab
https://cloud.mysite.com/remote.php/dav/files/username/ /path/to/mount davfs rw,user,noauto 0 0
提示: 为了允许自动挂载,您还可以将您的用户名(以及密码,如果您愿意)存储在一个文件中,如 davfs2#存储凭据 中所述。
注意: 如果创建/复制文件不可能,但在目录上执行相同的操作有效,请参阅 davfs2#创建/复制文件不可能和/或冻结

在 GNOME 文件(Nautilus)中挂载文件

您可以通过 WebDAV 协议在 Nautilus(“+ 其他位置”)中直接访问文件。使用您的 Nextcloud 安装 Web GUI 中显示的链接(例如 https://cloud.mysite.com/remote.php/webdav/),但将协议名称 https 替换为 davs。Nautilus 将在尝试连接时要求输入用户名和密码。

注意: 确保您已安装 gvfs-dnssd,否则您可能会收到错误“位置不可挂载”。

Android

Google PlayF-Droid 下载官方 Nextcloud 应用程序。

要启用联系人和日历同步(Android 4+)

  1. 下载 DAVx5 (Play Store, F-Droid)。
  2. 帐户设置中创建一个新的 DAVdroid 帐户,并指定您的服务器 URL(例如 https://cloud.mysite.com)和登录名/密码对。
注意: 如果您使用正确的重定向配置了 Web 服务器,如上面的 Web 服务器 部分所示,则无需 /remote.php/{carddav,webdav} 部分。DAVdroid 将自行找到正确的 URL。

iOS

App Store 下载官方 Nextcloud 应用程序。

提示和技巧

使用 “occ” 命令行工具

occ 是一个用于服务器管理的有用工具。有关 详细信息,请参阅 Nextcloud 的文档。您可以使用 occ 执行许多常见的服务器操作,例如管理用户和配置应用程序。

/usr/bin/occ 提供了原始 /usr/share/webapps/nextcloud/occ 的便捷包装器,它自动以默认用户 (nextcloud) 身份运行,使用默认的 PHP 可执行文件和 PHP 配置文件。可以使用环境变量 NEXTCLOUD_USERNEXTCLOUD_PHPNEXTCLOUD_PHP_CONFIG 分别指定非默认用户、PHP 可执行文件和 PHP 配置文件。特别是后者(使用 NEXTCLOUD_PHP_CONFIG)在 Nextcloud 的设置方式如 配置应用程序服务器 部分所述时是必要的,即使用 Nextcloud 特定的 PHP 配置。在这种情况下,将 export NEXTCLOUD_PHP_CONFIG=/etc/webapps/nextcloud/php.ini 放入您的 .bashrc 中。

当使用软件包 php 而不是推荐的软件包 php-legacy 时,您还必须设置 NEXTCLOUD_PHP,即 export NEXTCLOUD_PHP=/usr/bin/php

警告: 当使用 php-legacy-apcu 进行缓存时,请确保在 /etc/webapps/nextcloud/php.ini 中设置 apc.enable_cli=1。否则,occ 命令将抱怨 APCu 未正确配置。

Pacman hook

nextcloud 软件包附带一个 pacman hook,它负责在软件包更新后自动升级 Nextcloud 数据库。查看 /usr/share/doc/nextcloud/nextcloud.hook

不幸的是,此 hook 在运行 occ upgrade 时无条件地使用全局 php.ini,即它不考虑环境变量 NEXTCLOUD_PHP_CONFIG 的值,如上面的 使用 “occ” 命令行工具 中所述。

作为可能的解决方法,在适当的位置制作交付的 hook 文件的副本

# mkdir -vp /etc/pacman.d/hooks
# cp -a /usr/share/doc/nextcloud/nextcloud.hook /etc/pacman.d/hooks/10-nextcloud.hook

并将以 Exec 开头的行更改为

/etc/pacman.d/hooks/10-nextcloud.hook
Exec = /usr/bin/runuser -u nextcloud -- /usr/bin/php-legacy --php-ini /etc/webapps/nextcloud/php.ini /usr/share/webapps/nextcloud/occ upgrade

在子目录中运行 Nextcloud

Web 服务器 部分中的说明将导致您的 Nextcloud 安装可通过专用服务器名称访问的设置,例如 cloud.mysite.com。如果您希望 Nextcloud 位于子目录中,例如 www.mysite.com/nextcloud,则

  • 对于 nginx,请参阅 Nextcloud 文档中明确涵盖此 主题 的部分。
  • 对于 apache,编辑您包含的 /etc/httpd/conf/extra/nextcloud.conf,并注释掉包含文件的 <VirtualHost *:80> ... </VirtualHost> 部分。
注意: 不要忘记为服务发现配置 .well-known URL。有关更多信息,请参阅 Nextcloud 文档中的 服务发现

Docker

有关在 Docker 中运行 Nextcloud 的信息,请参阅 Docker Hub 上的 Nextcloud 存储库。

Office 集成

目前有三种不同的 Office 集成解决方案

这三者共同之处在于都需要专用服务器,并且需要调整您的 Web 服务器以将某些请求转发到 Office 服务。然后,通过特定于上述产品之一的 Nextcloud 应用程序来完成与 Nextcloud 的实际集成。

请注意,这三种产品都面向企业,即您需要为 Office 服务付费。只有 Collabora 提供免费的开发者计划 (CODE)。ONLYOFFICE 提供价格合理的 家庭服务器 计划。

有关安装、设置说明以及与 Nextcloud 集成的信息,请查阅

禁用应用程序推荐

默认情况下,Nextcloud 会向新客户端推荐应用程序,这可能会导致大量通知。要禁用此功能,请使用 occ app:disable recommendations 禁用 recommendations 应用程序。

使用 calcardbackup 备份日历和地址簿

可以安装和配置 calcardbackupAUR 软件包,以提供日历和/或地址簿数据库的定期备份。根据您的喜好编辑 /etc/calcardbackup/calcardbackup.conf,然后 启动启用 calcardbackup.timer

故障排除

读取日志

默认情况下,Web 应用程序的日志在 /var/log/nextcloud/nextcloud.log 中可用。条目(行)为 JSON 格式,可能非常长。使用 jq 可以大大提高可读性

# jq . </var/log/nextcloud/nextcloud.log | less

“is_file(): open_basedir restriction in effect” 的解决方法

在 Nextcloud v28.0.4 中引入了一个回归,它在包含以下内容的错误消息中体现出来

is_file(): open_basedir restriction in effect

在日志文件 /var/log/nextcloud/nextcloud.log 中。在此消息之后给出的文件路径在一个位置缺少一个斜杠,而在另一个位置则多了一个斜杠,例如

File (/usr/share/webapps/nextcloudapps//dav/l10n/de.js)

这是一个已知的 bug,它已经 修复反向移植到 v28.0.5。对于 v28.0.4,您可以应用以下解决方法

  • 添加一个指向 /usr/share/webapps/nextcloud/apps 的符号链接 /usr/share/webapps/nextcloudapps
# cd /usr/share/webapps
# ln -sf nextcloud/apps nextcloudapps
  • 将此符号链接的路径添加到与您的 Nextcloud 安装相关的 open_basedir 设置中。这些设置是
/etc/webapps/nextcloud/php.ini
open_basedir=...:/usr/share/webapps/nextcloudapps:...

并根据您使用的应用程序服务器,可以是 (FPM)

/etc/php-legacy/php-fpm.d/nextcloud.conf
php_value[open_basedir] = ...:/usr/share/webapps/nextcloudapps:...

或 (uWSGI)

/etc/uwsgi/nextcloud.ini
php-set = open_basedir=...:/usr/share/webapps/nextcloudapps:...

在 v28.0.5 中,您应该能够再次回滚此解决方法。

将 v27 升级到 v28

将版本 27 安装升级到版本 28 需要以下步骤

安装并启用扩展 sodium

在版本 28 中,建议安装并启用 PHP 扩展 sodium,它提供了 argon2 哈希算法。作为依赖项(即使用 --asdeps)安装相应的软件包 php-legacy-sodium,并在两个位置启用它

  • /etc/webapps/nextcloud/php.ini,供 occ 命令和后台作业使用,以及
  • 根据您使用的应用程序服务器,可以是
    • uWSGI 情况下的 /etc/uwsgi/nextcloud.ini,或
    • FPM 情况下的 /etc/php-legacy/php-fpm.d/nextcloud.conf

只需查找其他扩展已启用的现有部分,并添加与 sodium 对应的额外行。

将 maintenance_window_start 添加到配置

建议将参数 maintenance_window_start 添加到 Nextcloud 的配置文件 /etc/webapps/nextcloud/config/config.php 中。有关详细信息,请参阅 #后台作业 部分和 Nextcloud 的 文档

“ResourceLocator can not find a web root” 的解决方法

注意: 此问题已在 v28.0.4 版本中解决。

直到版本 28.0.3,Nextcloud 都会遇到一个回归,该回归表现在日志 /var/log/nextcloud/nextcloud.log 中充斥着如下消息

ResourceLocator can not find a web root

请参阅相应的 GitHub 工单。幸运的是,该问题对 Nextcloud 的功能没有影响,但真正的问题可能会被此日志噪音掩盖。解决方法是更改 Nextcloud 的配置文件

/etc/webapps/nextcloud/config/config.php
'apps_paths' => 
  array (
    0 => 
    array (
      'path' => '/usr/share/webapps/nextcloud/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 => 
    array (
      'path' => '/usr/share/webapps/nextcloud/wapps',
      'url' => '/wapps',
      'writable' => true,
    ),
  ),

/usr/share/webapps/nextcloud/wapps/var/lib/nextcloud/apps 的符号链接。它是 nextcloud 软件包的一部分 - 因此通常已经存在。如果由于某种原因它不存在,请使用以下命令创建它

# ln -sf /var/lib/nextcloud/apps /usr/share/webapps/nextcloud/wapps

当问题解决后,可以将 path 更改回 /var/lib/nextcloud/apps

迁移到 php-legacy

过去曾多次发生 php 软件包及时更新到最新 PHP 版本(符合 Arch Linux 的滚动发布理念),但 Nextcloud 与这个全新的版本不兼容 - 破坏现有安装并给 nextcloud 软件包的维护者和用户造成大量工作。当软件包 php 从版本 8.1 切换到版本 8.2 时,这种情况再次发生。

为了避免这种频繁的麻烦,在那时 php-legacy 系列 新软件包被 引入。这些软件包将遵循最旧但仍 积极支持的 PHP 分支。nextcloud 软件包已修改为依赖于元软件包 php-interpreter,该软件包由 phpphp-legacy 提供。这样,nextcloud 软件包的用户可以选择在 phpphp-legacy 之上构建其 Nextcloud 安装。

强烈建议选择 php-legacy。使用这个仅稍稍过时的 PHP 版本,系统升级导致现有 Nextcloud 安装不可用的情况将非常不可能发生。

警告: 选择最新和最棒的 PHP 版本(即 php)的用户必须为 php 软件包切换主要版本甚至次要版本时的问题做好准备。这些问题将主要表现在 nextcloud 突然不提供 php 作为依赖项(因为其版本在当时不受 Nextcloud 支持)。这实际上将迫使选择 php 的用户偶尔临时迁移到 php-legacy,即在稍后某个时候他们将不得不迁移回 php

迁移到 php-legacy 需要一些手动操作。根据您的实际设置,必须应用以下任务的子集

注意: 以下操作列表假设您的 Nextcloud 安装已按照本 wiki 文章进行设置。如果您的设置与此方法有所不同,请格外小心并适当调整步骤。

PHP 扩展

php 扩展替换为其对应的 php-legacy 对等版本。例如,卸载 php-apcu php-fpm php-gd php-imagick php-pgsql,并以依赖项方式安装 php-legacy-apcu php-legacy-fpm php-legacy-gd php-legacy-imagick php-legacy-pgsql

之前的扩展 php-intl 是一个例外,因为它已成为 phpphp-legacy 的组成部分。因此,此处无需显式处理此软件包。

PHP 扩展的实际集合取决于数据库、内存对象缓存、应用服务器和其他因素。当然,如果另一个应用程序依赖于最新的 PHP 版本,则可能仍然需要非 legacy 模块。对于 php 本身也适用。

Nextcloud 特定的 php.ini 副本

/etc/webapps/nextcloud/php.ini
open_basedir=...:/usr/lib/php-legacy/modules:...
extension_dir = "/usr/lib/php-legacy/modules/"
;extension=imap                                            <= to be deleted

FPM 配置

(仅当使用应用服务器 FPM 时适用。)

$ mv /etc/php/php-fpm.ini /etc/php-legacy/php-fpm.ini
$ mv /etc/php/php-fpm.d/nextcloud.conf /etc/php-legacy/php-fpm.d/nextcloud.conf

修改 /etc/php-legacy/php-fpm.ini

/etc/php-legacy/php-fpm.ini
extension_dir = "/usr/lib/php-legacy/modules/"
;extension=imap                                            <= to be deleted

修改 /etc/php-legacy/php-fpm.d/nextcloud.conf

/etc/php-legacy/php-fpm.d/nextcloud.conf
listen = /run/php-fpm-legacy/nextcloud.sock
;       It's available in: /usr/share/php-legacy/fpm/status.html
access.log = /var/log/php-fpm-legacy/access/$pool.log
; uncomment if php-imap is installed and used              <= to be deleted
; php_value[extension] = imap                              <= to be deleted

可选,但建议:使 www.conf 成为空操作,同时仍然能够跟踪此文件在未来 php-legacy-fpm 更新中可能进行的修改

$ mv /etc/php-legacy/php-fpm.d/www.conf /etc/php-legacy/php-fpm.d/www.conf.package
$ echo "; just a no-op" > /etc/php-legacy/php-fpm.d/www.conf

停止禁用 systemd 服务 php-fpm.service。为 php-fpm-legacy.service 创建一个drop-in 文件

/etc/systemd/system/php-fpm-legacy.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/php-fpm-legacy --nodaemonize --fpm-config /etc/php-legacy/php-fpm.conf --php-ini /etc/php-legacy/php-fpm.ini
ReadWritePaths=/var/lib/nextcloud
ReadWritePaths=/etc/webapps/nextcloud/config

启用启动 systemd 服务 php-fpm-legacy.service

uWSGI 配置

(仅当使用应用服务器 uWSGI 时适用。)

/etc/uwsgi/nextcloud.ini
php-set = open_basedir=...:/usr/lib/php-legacy/modules...
# uncomment if php-imap is installed and used               <= to be deleted
# php-set = extension=imap                                  <= to be deleted

Nginx 配置

修改配置文件,其中配置了将某些请求转发到应用服务器。例如,对于 FPM

cloud.mysite.com.conf
fastcgi_pass unix:/run/php-fpm-legacy/nextcloud.sock;

对于 uWSGI,无需进行适配。

Apache HTTP 服务器配置

如果您使用 Apache 的 HTTP 服务器和 FPM 作为应用服务器,请适配您配置中的此行

SetHandler "proxy:unix:/run/php-fpm-legacy/nextcloud.sock|fcgi://nextcloud/"

对于 uWSGI,无需进行适配。

后台作业

更新 Nextcloud 计划后台作业的 drop-in 文件

/etc/systemd/system/nextcloud-cron.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/php-legacy -c /etc/webapps/nextcloud/php.ini -f /usr/share/webapps/nextcloud/cron.php

Pacman hook

pacman hook /etc/pacman.d/hooks/10-nextcloud.hook 也需要适配。将以 Exec 开头的行更改为

/etc/pacman.d/hooks/10-nextcloud.hook
Exec = /usr/bin/runuser -u nextcloud -- /usr/bin/php-legacy --php-ini /etc/webapps/nextcloud/php.ini /usr/share/webapps/nextcloud/occ upgrade

否则,在下次 Nextcloud 升级期间,pacman 将会抱怨找不到 /usr/bin/php

清理

不要忘记清理可能已过时的文件和目录。潜在的候选对象是

/usr/lib/php
/etc/php

一个或多个应用的怪异行为

在两个位置可以找到包含 Nextcloud 应用文件的文件夹

  • /usr/share/webapps/nextcloud/apps(又名只读应用目录)。这是 nextcloud 软件包和应用软件包(例如 nextcloud-app-contacts)放置包含 Nextcloud 应用文件的文件夹的位置。
  • /var/lib/nextcloud/apps(又名可写应用目录)。这是您可以找到通过 GUI 或 occ app:install 命令安装的应用文件的文件夹的位置。

当一个应用的文件可以在两个目录中找到时(尤其是在不同版本中),可能会发生各种奇怪的事情。在一个具体的 案例 中,contacts 应用可以在只读应用目录和可写应用目录中找到。结果,GUI 中的联系人页面没有显示,仍然是空白白色。浏览器的 Javascript 控制台显示了一条错误消息

Uncaught Error: Could not find initial state contactsinteraction of contacts

检查在两个位置都找到的应用。要找出是否删除只读目录或可写目录中的应用文件夹,请确定该应用是否是软件包的一部分。运行

# cd /usr/share/webapps/nextcloud/apps
# pacman -Qo * >/dev/null

所有报告为

error: No package owns ....

(并且也可以在可写应用目录中找到)的文件夹都可以从 /usr/share/webapps/nextcloud/apps 中安全删除。其他双重安装的应用(即属于软件包的应用)应从 /var/lib/nextcloud/apps 中删除。

InnoDB 拒绝写入 ROW_FORMAT=COMPRESSED 的表

MariaDB 版本 >= 10.6 且 < 10.6.6 与 Nextcloud 不兼容,因为数据库对压缩的 InnoDB 表强制执行 只读,而 Nextcloud 过去(现在仍然)在使用这些类型的表

从 MariaDB 10.6.0 到 MariaDB 10.6.5,ROW_FORMAT 为 COMPRESSED 的表默认情况下是只读的。这本意是移除写入支持和弃用该功能的第一步。
此计划已被取消,从 MariaDB 10.6.6 开始,COMPRESSED 表不再默认只读。

此外,Nextcloud 已经 解决 了这个问题。从 Nextcloud v24 开始,新的 Nextcloud 安装不再使用行格式 COMPRESSED。必须注意的是,现有的(v24 之前的)安装不会自动从行格式 COMPRESSED 迁移走。

底线:您可能不受影响,因为 Arch Linux 自 2022-02-10 以来一直在发布 MariaDB v10.6.6 或更高版本。

在您不太可能受到此问题影响的情况下,有几种可能的补救措施

  • 适配您的 MariaDB 配置
/etc/my.cnf.d/server.cnf
[mariadb-10.6]
  innodb_read_only_compressed=OFF
  • 将您的 MariaDB 表从行格式 COMPRESSED 迁移到 DYNAMIC,如 一些 评论 为相应的 Nextcloud 问题 所建议的那样。请注意,只要您使用 Nextcloud < v24,新表将再次使用行格式 COMPRESSED - 因此也需要以相同的方式进行迁移。
  • 用 PostgreSQL 替换 MariaDB,并使用 occ db:convert-type 迁移您的 Nextcloud 实例的数据。有关详细信息,请参阅 Nextcloud 的 文档

升级到 >= 21.0.0 后出现权限和设置问题

注意: 在 nextcloud 21.0.0 之前,Web 应用程序是使用 http 用户运行的。这在跨应用程序访问此用户方面存在安全隐患(它可以访问所有 Web 应用程序的所有数据)。

自 21.0.0 版本以来,nextcloud 更紧密地遵循 Web 应用程序软件包指南。这引入了单独的用户 nextcloud,Web 应用程序以该用户身份运行。

从 nextcloud < 21.0.0 升级后,请确保

  • 数据目录位于 /var/lib/nextcloud/data
  • 可写应用目录位于 /var/lib/nextcloud/apps
  • 数据目录和可写应用目录,以及它们下面的所有文件,都是可写的,并且归 nextcloud 用户所有
  • Web 应用程序配置文件位于 /etc/webapps/nextcloud/config/ 中,并且该目录及其内容是可写的,并且归 nextcloud 用户所有
  • 应用服务器(例如 FPMuWSGI)配置为以 nextcloud 用户而不是 http 用户身份运行 Web 应用程序
  • 更新 cron 作业/systemd 定时器以使用新用户运行
  • 最后,通过执行以下操作,允许您的 Web 服务器用户 http 读取 nextcloud 安装目录 /usr/share/webapps/nextcloud
 # chown -R nextcloud:http /usr/share/webapps/nextcloud

登录循环,在 access.log、error.log 和 nextcloud.log 中没有任何线索

正如 论坛帖子 中提到的,可以通过设置 sessions 目录的正确权限来解决此问题。(有关详细信息,请参阅 Nextcloud 文档。)sessions 目录也可能完全丢失。 系统和环境 中记录了此目录的创建。

/var/lib/nextcloud 应该看起来像这样

drwxr-xr-x  6 nextcloud nextcloud 4096 17. Apr 00:56 ./
drwxr-xr-x 21 root      root      4096 17. Apr 00:53 ../
drwxr-xr-x  2 nextcloud nextcloud 4096 16. Feb 00:21 apps/
drwxrwx--- 10 nextcloud nextcloud 4096 16. Apr 13:46 data/
drwx------  2 nextcloud nextcloud 4096 17. Apr 01:04 sessions/

此外,这可能是由于系统分区已满造成的,原因是 nextcloud.log 文件过大,这归因于 此错误。在这种情况下,截断日志文件,并在 config.php 中禁用预览生成器或将日志级别设置为 4,然后重启 Nextcloud 会有所帮助。

环境变量不可用

根据您使用的应用服务器,可以为 Nextcloud 的 PHP 代码提供自定义环境变量。

FPM

根据 Nextcloud 文档,在 /etc/php-legacy/php-fpm.d/nextcloud.conf 中添加一行或多行,例如:

/etc/php-legacy/php-fpm.d/nextcloud.conf
env[PATH] = /usr/local/bin:/usr/bin:/bin

uWSGI

/etc/uwsgi/nextcloud.ini 中添加一行或多行,例如:

/etc/uwsgi/nextcloud.ini
env = PATH=/usr/local/bin:/usr/bin:/bin

请注意,第二个 = 周围不能有任何空格。

您正在通过安全连接访问您的实例,但是您的实例正在生成不安全的 URL

如果您在管理设置中收到以下消息

您正在通过安全连接访问您的实例,但是您的实例正在生成不安全的 URL。这很可能意味着您位于反向代理之后,并且覆盖配置变量未正确设置。请阅读有关此内容的文档页面。

在您的配置文件中添加以下内容: [7]

/etc/webapps/nextcloud/config/config.php
'trusted_proxies' => ['192.168.1.0'],
'overwriteprotocol' => 'https',

192.168.1.0 替换为您的公网 IP。

Nextcloud 报告索引损坏 (MariaDB)

如果 Nextcloud 报告索引损坏(例如在 occ db: 命令期间或在管理 > 日志记录中),您可以通过执行以下命令修复数据库

$ mysqlcheck --check --auto-repair nextcloud -u nextcloud -p

如果命令失败,它仍然会指出包含损坏索引的表 TABLE。通过登录 mariadb 来修复它

$ mysql -u nextcloud -p
mysql> use nextcloud;
mysql> check table TABLE;
mysql> optimize table TABLE;
mysql> exit;

替换 TABLE 以匹配您的发现。

无法获取 Collabora capabilities endpoint

如果您收到以下响应

Failed to fetch the Collabora capabilities endpoint: Client error: `GET https://127.0.0.1/wapps/richdocumentscode/proxy.php?req=/hosting/capabilities` resulted in a `404 Not Found` response

请仔细检查您的 config.php,条目 overwrite.cli.url 是否已按照 配置 / Nextcloud 部分中的描述进行设置。

另请参阅