Nextcloud

出自 ArchWiki

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

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

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

Nextcloud 是 ownCloud 的一个分支。有关历史,请参阅 Wikipedia。

安装概述

一个完整的 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(或者更好的是,从 /var/cache/pacman/pkg 下面的 php-legacy 软件包 tarball 中提取 php.ini)。 尽管不是绝对必要,但请更改副本的所有权

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

Nextcloud 文档中列出的大多数必需的 PHP 模块已在刚刚复制的裸 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 是您必须选择的数据库用户 nextcloud 的实际密码的占位符。)使用 \q 退出工具。

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

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

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

不需要进一步的配置(与 MariaDB 相关)(与 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 { ... } 。 只需在处理将带有 PHP URI 的请求转发到应用服务器的 location 块中指定 fastcgi_pass unix:/run/php-fpm-legacy/nextcloud.sock; 即可。 当使用 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_php 已无法再使用。 需要应用 mod_proxy_fcgimod_proxy_uwsgi

有关如何将 Apache 与 FPM 集成的信息可以在本 wiki 中找到。 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 服务和 timer 单元。 服务单元需要进行一些调整,以便作业使用正确的 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 选项,并且在本地使用 Redis 和本地 Unix 套接字,则必须扩展 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. 下载 DAVx5Play 商店F-Droid)。
  2. 账户设置中创建一个新的 DAVdroid 账户,并指定您的服务器 URL(例如 https://cloud.mysite.com)和登录名/密码对。
注意: 如果您使用正确的重定向配置了 Web 服务器,则不需要 /remote.php/{carddav,webdav} 部分,如上面的 Web 服务器 部分所示。 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,即它没有考虑到 使用 "occ" 命令行工具 中上述环境变量 NEXTCLOUD_PHP_CONFIG 的值。

作为可能的解决方法,在适当的位置复制交付的 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 以合理的价格提供 Home Server 计划。

有关安装、设置说明以及与 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,该 bug 已被 修复向后移植到 v28.0.5。 对于 v28.0.4,您可以应用以下解决方法

  • 添加一个符号链接 /usr/share/webapps/nextcloudapps,指向 /usr/share/webapps/nextcloud/apps
# 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 哈希算法。 安装相应的软件包 php-legacy-sodium 作为依赖项(即使用 --asdeps),并在两个位置启用它

  • /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-legacy 对等项替换 php 扩展。 例如,卸载 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,COMPRESSED 行格式的表默认情况下是只读的。 这旨在作为取消写入支持并弃用该功能的第一步。
此计划已被废弃,从 MariaDB 10.6.6 开始,COMPRESSED 表不再默认只读。

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

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

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

  • 调整您的 MariaDB 配置
/etc/my.cnf.d/server.cnf
[mariadb-10.6]
  innodb_read_only_compressed=OFF
  • 按照 一些 评论 对相应的 Nextcloud 问题 的建议,将您的 MariaDB 表从行格式 COMPRESSED 迁移到 DYNAMIC。 请注意,只要您停留在 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

如果您收到以下响应

未能获取 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 部分中的描述进行设置。

另请参阅