概述
- Nextcloud与Onlyoffice主要解决公司内部文档存储与在线编辑问题,部署过程中涉及的问题比较多,故整理部署过程如下。
- 受限时间,只做了基础单点部署,后续有时间尝试Nextcloud与Onlyoffice的集群模式(主要解决Onlyoffice的多节点之间状态同步问题)
参考
- github: nextcloud / docker
- Nextcloud configuration
- Nextcloud Docker 容器化部署指南
- Nextcloud Docker环境变量完全指南
- linuxserver/nextcloud Docker镜像文档
- Nextcloud Docker 镜像使用介绍
环境
-
虚拟机
- 8C/32G/200G 192.168.16.41 主节点
- 8C/32G/200G 192.168.16.51 冷备节点
-
操作系统
Ubuntu24.04
-
数据库
- 172.28.3.12 主MySQL 8.4.8 和Redis 7.2.5
- 172.28.3.6 从MySQL 8.4.8 和Redis 7.2.5
-
对象存储
- Minio集群(因Minio社区版已进入维护期,后续考虑替换其它对象存储)
-
容器
- docker
安装服务
Nextcloud安装步骤
- 创建外部数据库
- 创建外部对象存储
- 使用docker启动服务,服务使用外部数据库和对象存储
创建数据库
- 172.28.3.12和172.28.3.6服务器上预装好MySQL8.4.8和Redis7.2.5
- 172.28.3.12上MySQL数据库创建nextcloud数据库
sql
CREATE DATABASE IF NOT EXISTS nextcloud DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| nextcloud |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
创建对象存储
- 创建Minio的Bucket,Access Key,Secret Key


- 配置权限
请自行查阅Minio相关文档
创建目录
- Nextcloud使用docker容器运行,宿主机需预创建挂载目录和自定义配置文件存储目录
- 目录结构如下
bash
root@192-168-016-021:/public/application/nextcloud# tree -L 1
.
├── config
├── custom_apps
├── custom_config
├── data
├── docker-compose.yml
├── logs
│ └── apache
├── onlyoffice.tar.gz
└── themes
- config: nextcloud的配置挂载目录
- custom_apps: nextcloud官方支持自定义插件目录
- custom_config:自定义配置文件存储目录(无需挂载)
- data:nextcloud的数据目录
- docker-compose.yml:docker compose文件
- logs:nextcloud日志目录(apache日志,nextcloud的服务日志在data目录下)
- onlyoffice.tar.gz:onlyoffice-nextcloud插件的发布包(github下载)
- themes:nextcloud样例
创建docker-compose文件
-
配置项说明:
- 因为使用专用虚拟机运行nextcloud和onlyoffice,所以docker直接使用host网络模式,提升性能
- nextcloud使用当前最新版镜像nextcloud:33.0.0
- 使用外部MySQL数据库,便于提升性能和冷热备份。
- 使用外部Redis数据库,便于提升性能和冷热备份,如果高负载请按官方建议使用Redis集群
- 使用外部Minio存储,Minio是集群,使用为了保证数据的安全性
- 服务相关配置,详见 docker-compose.yml中的说明
-
docker-compose.yml
yaml
services:
nextcloud:
image: nextcloud:33.0.0
container_name: nextcloud-server
restart: always
#user: root
# 启用 host 网络模式(仅 Linux 支持),禁用bridge网络
network_mode: host
#ports:
# - "8080:80"
# 新增:因为是单节点,可以绑定域名到本机IP。如果是多节点需要绑定内部负载均衡的IP
extra_hosts:
- "cloud.xk.com:127.0.0.1" # 绑定本机IP,使用本机服务
- "office.xk.com:127.0.0.1" # 绑定本机IP,使用本机服务
# 传统模式:内存硬限制
mem_limit: 8G
# 传统模式:内存预留
mem_reservation: 4G
# 增大容器内文件句柄数量,默认是1024。不增加服务会报警告
ulimits:
nofile:
soft: 65535
hard: 65535
environment:
# 外部 Mysql(请替换成自己的配置)
- MYSQL_HOST=nextcloud.mysql.xk.in
- MYSQL_PORT=3306
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=root
- MYSQL_PASSWORD=kx0000xk
# 外部 单例Redis(请替换成自己的配置)
- REDIS_HOST=nextcloud.redis.xk.in
- REDIS_HOST_PORT=6379
- REDIS_PASSWORD=kx0000xk
- REDIS_HOST_PASSWORD=kx0000xk # 兼容旧版镜像的 Redis 密码变量
# 外部 MinIO 配置(请替换成预创建资源)
- OBJECTSTORE_S3_BUCKET=nextcloud-prod # 替换为你已创建的MinIO桶名
- OBJECTSTORE_S3_REGION=xk-1 # MinIO无实际区域,随便填
- OBJECTSTORE_S3_HOST=cluster01.minio.xk.in # MinIO域名(自定义)
- OBJECTSTORE_S3_PORT=9000 # MinIO端口
- OBJECTSTORE_S3_KEY=nextcloud-prod # 替换为已创建的Access Key
- OBJECTSTORE_S3_SECRET=yQ0QqDd65bttuitu6tit8LgwiUZ5 # 替换为已创建的Secret Key
- OBJECTSTORE_S3_SSL=false # http协议,保持false
- OBJECTSTORE_S3_USEPATH_STYLE=true # MinIO必须开启,保持true
- OBJECTSTORE_S3_AUTOCREATE=false # 重要:已预创建桶,所以关闭自动创建
# 建议不启用,web界面系统初始化时手动填写(会自动写入数据库)
#- NEXTCLOUD_ADMIN_USER=admin
#- NEXTCLOUD_ADMIN_PASSWORD=admin
- TZ=Asia/Shanghai
# 如果不指定端口,那么会使用TRUSTED_DOMAIN下所有端口,如果指定了端口,比如8080,那么只接收指定端口的请求。
# 建议填写上所需要的所有域名。系统初始化时,并不依赖此配置,需要通过命令,手动添加,详见系统配置章节
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.xk.com 192.168.16.41 192.168.16.51
# nginx代理IP需单独加入TRUSTED_PROXIES,添加内部Nginx负载均衡的所有IP
- TRUSTED_PROXIES=192.168.5.154 192.168.5.120 172.26.111.1 172.26.112.2
- APACHE_DISABLE_REWRITE_IP=1 # 禁用 IP 重写,让 Apache 直接从 TCP 连接获取真实 IP (Host 模式下非常重要)
#- OVERWRITEPROTOCOL=https # 默认自动识别HTTPS或HTTP。若用 HTTPS 则改为 https;若用 HTTP 则改为 http
- ALLOW_LOCAL_REMOTE_SERVERS=true # 允许 Nextcloud 访问本地 / 内网服务器
- PHP_MEMORY_LIMIT=4096M # PHP 内存限制(根据服务器配置调整),默认512M
- PHP_UPLOAD_LIMIT=2048M # 设置post_max_size 和 upload_max_filesize,默认512M
- PHP_OPCACHE_MEMORY_CONSUMPTION=128 # PHP共享内存,默认128M,
- PHP_MAX_EXECUTION_TIME=3600 # 远端数据库/Redis操作超时延长
- PHP_MAX_INPUT_TIME=3600
- APC_SHM_SIZE=256M # APCu共享内存(最大化利用本机缓存,官方推荐)
- NEXTCLOUD_MEMORY_CACHE=APCu
- FILE_UPLOAD_MAX_MEMORY=2560M # 限制单个文件上传时允许占用的最大内存>=PHP_UPLOAD_LIMIT
volumes:
# 首次启动config必须是空目录。系统初始化会生成配置文件,这些文件需要持久化挂载。
# 必须在初始化完成后,自定义配置文件才能拷贝到config目录下
- /public/application/nextcloud/config:/var/www/html/config
- /public/application/nextcloud/themes:/var/www/html/themes
- /public/application/nextcloud/data:/var/www/html/data
- /public/application/nextcloud/custom_apps:/var/www/html/custom_apps
- /public/application/nextcloud/logs/apache:/var/log/apache2
# 挂载修改Apache默认端口为8080,避免与onlyoffice端口冲突,配置文件内容稍后有说明
- /public/application/nextcloud/custom_config/ports.conf:/etc/apache2/ports.conf
- /public/application/nextcloud/custom_config/000-default.conf:/etc/apache2/sites-available/000-default.conf
# 建议在nextcloud初始化完成后,添加挂载自定义apache配置文件,然后重启。配置文件内容稍后有说明
- /public/application/nextcloud/custom_config/nextcloud-apache.conf:/etc/apache2/conf-enabled/nextcloud-apache.conf
# 以下文件不需要挂载,只需要在nextcloud初始化完成后,拷贝到config目录下,重启使其生效。
# 系统未初始化前,不能拷贝,否则nextcloud无法初始化。
#- /public/application/nextcloud/custom_config/redis-apcu.config.php:/var/www/html/config/redis-apcu.config.php
# 以下配置文件内容供参考,实际部署不需要拷贝到config目录下
#- /public/application/nextcloud/custom_config/onlyoffice.config.php:/var/www/html/config/onlyoffice.config.php
#- /public/application/nextcloud/custom_config/disable-appstore.config.php:/var/www/html/config/disable-appstore.config.php
# 健康检查(确保容器正常运行),修改为8080,保持与修改自定义修改端口一致。
# 健康检查URL使用默认/,防止日志报警告信息。与nextcloud定时任务配置会设置为cron模式(官方推荐)。
healthcheck:
#test: ["CMD", "curl", "-f", "http://localhost:80/cron.php"]
test: ["CMD", "curl", "-f", "http://localhost:8080/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
自定义配置文件
ports.conf 和 000-default.conf
两个文件是修改apache默认端口,从80变更为监听8080端口(防止与onlyoffice冲突)
- 创建临时容器,拷贝
bash
docker run -d --name temp nextcloud:33.0.0
docker cp temp:/etc/apache2/ports.conf /public/application/nextcloud/custom_config/
docker cp temp:/etc/apache2/000-default.conf /public/application/nextcloud/custom_config/
docker rm -f temp
- custom_config/ports.conf
bash
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
#Listen 80
Listen 8080
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
- custom_config/000-default.conf
bash
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
#Listen 80
Listen 8080
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
root@192-168-016-051:/public/application/nextcloud# cat custom_config/000-default.conf
#<VirtualHost *:80>
<VirtualHost *:8080>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/
nextcloud.conf
nextcloud开放上次文件大小限制。请求路径如下:
请求--> Apache限制 --> PHP限制 --> NextCloud限制
- Apache:conf-enabled/nextcloud.conf 配置允许 2GB 和连接时长
- PHP:环境变量 PHP_UPLOAD_LIMIT=2048M(docker-compose.yml中设置)
bash
mkdir -p /public/application/nextcloud/custom_config
cat >> nextcloud-apache.conf <<EOF
# 2GB 上传大小限制(字节数:2*1024*1024*1024=2147483648)
LimitRequestBody 2147483648
# 延长超时时间至1小时(适配2GB文件低速网络上传)
Timeout 3600
# 防止大文件上传时请求读取超时
RequestReadTimeout header=3600 body=3600
# 针对Nextcloud目录强化配置(确保权限和限制生效)
<Directory /var/www/html>
AllowOverride All
Require all granted
LimitRequestBody 2147483648
</Directory>
EOF
redis-apcu.config.php
自定义redis-apcu配置文件,启用redis缓存及共享session(nextcloud会根据字母顺序加载配置文件,后者会覆盖redis.config.php中相同值)。
bash
mkdir -p /public/application/nextcloud/custom_config
# 创建正确的缓存配置文件
cat > /public/application/nextcloud/custom_config/redis-apcu.config.php << 'EOF'
<?php
// 兼容 Nextcloud 初始化流程,先判断 $CONFIG 是否存在
if (!isset($CONFIG)) {
$CONFIG = [];
}
$CONFIG = array_merge($CONFIG, [
# APCu 本地缓存
'memcache.local' => '\OC\Memcache\APCu',
# Redis 分布式缓存(仅初始化完成后启用)
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
# Redis 连接配置
'redis' => [
'host' => getenv('REDIS_HOST'),
'port' => (int)getenv('REDIS_HOST_PORT') ?: 6379,
'password' => getenv('REDIS_HOST_PASSWORD') ?: '',
'timeout' => 3,
'dbindex' => 1,
],
# Redis 会话保持
'session_save_handler' => 'redis',
'session_save_path' => 'tcp://' . getenv('REDIS_HOST') . ':' . getenv('REDIS_HOST_PORT') . '?auth=' . getenv('REDIS_HOST_PASSWORD'),
# 优化配置
'apcu.enabled' => true,
'filelocking.enabled' => true,
'memcache.ttl' => 3600,
'redis.timeout' => 3,
]);
EOF
初始化系统
启动nextcloud
bash
cd /public/application/nextcloud
docker compose up -d
bash
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
nextcloud-server nextcloud:33.0.0 "/entrypoint.sh apac..." nextcloud 9 minutes ago Up 9 minutes (healthy)
bash
netstat -nltp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 1064106/apache2
添加信任域名
访问 http://192.168.16.41:8080,出现一下提示:

- 检查当前信任域名
- 默认只有初始化的一个IP+端口
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:system:get trusted_domains
192.168.16.41:8080
- 手动添加信任域名
bash
# 索引1:IP+端口(192.168.16.51:8080)
docker compose exec -u www-data nextcloud php -d memory_limit=1024M /var/www/html/occ config:system:set trusted_domains 1 --value=192.168.16.51:8080
# 索引2:IP+端口(127.0.0.1:8080)
docker compose exec -u www-data nextcloud php -d memory_limit=1024M /var/www/html/occ config:system:set trusted_domains 2 --value=127.0.0.1:8080
# 索引3:域名+端口(cloud.xk.com)
docker compose exec -u www-data nextcloud php -d memory_limit=1024M /var/www/html/occ config:system:set trusted_domains 3 --value=cloud.xk.com
- 验证添加结果
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:system:get trusted_domains
192.168.16.41:8080
192.168.16.51:8080
127.0.0.1:8080
cloud.xk.com
bash
cat /public/application/nextcloud/config/config.php | grep -A 5 trusted_domains
'trusted_domains' =>
array (
0 => '192.168.16.41:8080',
1 => '192.168.16.51:8080',
2 => '127.0.0.1:8080',
3 => 'cloud.xk.com',
),
初始化Nextcloud
-
设置账号和密码(保持在数据库)

-
开始安装,等待完成


系统初始化完成
- config目录下自动生成配置文件
bash
# config目录下生成配置文件
root@192-168-016-041:/public/application/nextcloud# tree -L 2
bash
.
├── config
│ ├── apache-pretty-urls.config.php
│ ├── apcu.config.php
│ ├── apps.config.php
│ ├── config.php
│ ├── config.sample.php
│ ├── redis.config.php
│ ├── reverse-proxy.config.php
│ ├── s3.config.php
│ ├── smtp.config.php
│ ├── swift.config.php
│ └── upgrade-disable-web.config.php
├── custom_apps
│ └── onlyoffice
├── custom_config
│ ├── 000-default.conf
│ ├── disable-appstore.config.php
│ ├── nextcloud-apache.conf
│ ├── onlyoffice.config.php
│ ├── ports.conf
│ └── redis-apcu.config.php
├── data
│ ├── index.html
│ └── nextcloud.log
├── docker-compose.yml
├── logs
│ └── apache
├── onlyoffice.tar.gz
└── themes
├── README
└── example
- MySQL数据库自动创建数据
sql
mysql> use nextcloud;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------------------+
| Tables_in_nextcloud |
+-----------------------------+
| oc_accounts |
| oc_accounts_data |
| oc_activity |
| oc_activity_mq |
| oc_addressbookchanges |
| oc_addressbooks |
| oc_appconfig |
| oc_appconfig_ex |
| oc_authorized_groups |
| oc_authtoken |
| oc_bruteforce_attempts |
| oc_calendar_invitations |
| oc_calendar_reminders |
| oc_calendar_resources |
| oc_calendar_resources_md |
| oc_calendar_rooms |
| oc_calendar_rooms_md |
| oc_calendarchanges |
| oc_calendarobjects |
| oc_calendarobjects_props |
| oc_calendars |
| oc_calendars_federated |
| oc_calendarsubscriptions |
| oc_cards |
| oc_cards_properties |
| oc_circles_circle |
| oc_circles_event |
| oc_circles_member |
| oc_circles_membership |
| oc_circles_mount |
| oc_circles_mountpoint |
| oc_circles_remote |
| oc_circles_share_lock |
| oc_circles_token |
| oc_collres_accesscache |
| oc_collres_collections |
| oc_collres_resources |
| oc_comments |
| oc_comments_read_markers |
| oc_dav_absence |
| oc_dav_cal_proxy |
| oc_dav_shares |
| oc_direct_edit |
| oc_directlink |
| oc_ex_apps |
| oc_ex_apps_daemons |
| oc_ex_apps_routes |
| oc_ex_deploy_options |
| oc_ex_occ_commands |
| oc_ex_settings_forms |
| oc_ex_task_processing |
| oc_ex_ui_files_actions |
| oc_ex_ui_scripts |
| oc_ex_ui_states |
| oc_ex_ui_styles |
| oc_ex_ui_top_menu |
| oc_federated_invites |
| oc_federated_reshares |
| oc_file_locks |
| oc_filecache |
| oc_filecache_extended |
| oc_files_metadata |
| oc_files_metadata_index |
| oc_files_reminders |
| oc_files_trash |
| oc_files_versions |
| oc_flow_checks |
| oc_flow_operations |
| oc_flow_operations_scope |
| oc_group_admin |
| oc_group_user |
| oc_groups |
| oc_jobs |
| oc_known_users |
| oc_login_flow_v2 |
| oc_migrations |
| oc_mimetypes |
| oc_mounts |
| oc_notifications |
| oc_notifications_pushhash |
| oc_notifications_settings |
| oc_oauth2_access_tokens |
| oc_oauth2_clients |
| oc_onlyoffice_filekey |
| oc_onlyoffice_instance |
| oc_onlyoffice_permissions |
| oc_open_local_editor |
| oc_photos_albums |
| oc_photos_albums_collabs |
| oc_photos_albums_files |
| oc_preferences |
| oc_preferences_ex |
| oc_preview_locations |
| oc_preview_versions |
| oc_previews |
| oc_privacy_admins |
| oc_profile_config |
| oc_properties |
| oc_ratelimit_entries |
| oc_reactions |
| oc_recent_contact |
| oc_schedulingobjects |
| oc_sec_signatory |
| oc_share |
| oc_share_external |
| oc_shares_limits |
| oc_storages |
| oc_storages_credentials |
| oc_systemtag |
| oc_systemtag_group |
| oc_systemtag_object_mapping |
| oc_taskprocessing_tasks |
| oc_text2image_tasks |
| oc_text_documents |
| oc_text_sessions |
| oc_text_steps |
| oc_textprocessing_tasks |
| oc_trusted_servers |
| oc_twofactor_backupcodes |
| oc_twofactor_providers |
| oc_twofactor_totp_secrets |
| oc_user_status |
| oc_user_transfer_owner |
| oc_users |
| oc_vcategory |
| oc_vcategory_to_object |
| oc_webauthn |
| oc_webhook_listeners |
| oc_webhook_tokens |
+-----------------------------+
129 rows in set (0.01 sec)
- 验证对象存储配置
bash
docker compose exec -it nextcloud php -f /var/www/html/occ config:system:get objectstore
class: \OC\Files\ObjectStore\S3
arguments:
bucket: nextcloud-prod
region: xk-1
hostname: cluster01.minio.xk.in
port: 9000
storageClass:
objectPrefix: urn:oid:
autocreate: false
use_ssl: false
use_path_style: true
legacy_auth: false
key: nextcloud-prod
secret: yQ0QqDdlJRFsdfasdfasdfasdffGLgwiUZ5
启用自定义配置
- 启用redis缓存及共享session
- 拷贝redis-apcu.config.php到config目录下
- 赋权config,www-data:www-data(uid:gid 33:33)
bash
cp -rf /public/application/nextcloud/custom_config/redis-apcu.config.php /public/application/nextcloud/config/redis-apcu.config.php
chown -R www-data:www-data /public/application/nextcloud/config/
- 重启nextcloud服务
bash
docker compose up -d --force-recreate
[+] up 1/1
✔ Container nextcloud-server Started
- 验证Redis配置生效
bash
# 输出中能看到 redis/memcache 相关配置即说明生效
docker compose exec -it nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:list
bash
docker compose exec -it nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:system:get redis
host: nextcloud.redis.xk.in
password: kx0000xk
port: 6379
timeout: 3
dbindex: 1
bash
docker compose exec -it nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:system:get memcache.distributed
\OC\Memcache\Redis
- 进入容器查看 APCu 状态
bash
docker exec -it nextcloud-server php -i | grep -A 10 "apcu"
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini,
/usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini,
/usr/local/etc/php/conf.d/docker-php-ext-exif.ini,
/usr/local/etc/php/conf.d/docker-php-ext-ftp.ini,
/usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-gmp.ini,
/usr/local/etc/php/conf.d/docker-php-ext-igbinary.ini,
/usr/local/etc/php/conf.d/docker-php-ext-imagick.ini,
/usr/local/etc/php/conf.d/docker-php-ext-intl.ini,
/usr/local/etc/php/conf.d/docker-php-ext-ldap.ini,
/usr/local/etc/php/conf.d/docker-php-ext-memcached.ini,
--
apcu
# APCu 扩展已启用
APCu Support => Enabled
Version => 5.1.28
APCu Debugging => Disabled
MMAP Support => Enabled
MMAP File Mask =>
Serialization Support => php, igbinary
Build Date => Feb 25 2026 22:08:30
Directive => Local Value => Master Value
配置服务
Nextcloud启动后,会有各种错误需要修正,如下:

数据库缺失索引
检测到一些缺失的可选索引。偶尔会添加新的索引(由 Nextcloud 或已安装的应用程序)以提高数据库性能。添加索引有时需要一段时间,并会暂时损害性能,因此在升级过程中不会自动完成。一旦添加了索引,对这些表的查询应该会更快。使用命令 occ db:add-missing-indices 来添加索引。缺少引索: "properties_name_path_user"在数据库表"properties"中
- 执行修复索引
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ db:add-missing-indices
# 输出结果
Adding additional properties_name_path_user index to the oc_properties table, this can take some time...
oc_properties table updated successfully.
- 检查数据库,看是否有其它错误信息(表结构中匹配信息,请忽略。例如- name: error_message)
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M occ db:schema:expected 2>&1 | grep -i -E "error|failed|fatal|denied|missing"
- error_message:
- name: error_message
- user_facing_error_message:
- name: user_facing_error_message
Mimetype 迁移
有一个或多个 mimetype 迁移可用。有时会添加新的 mimetype 以更好地处理某些文件类型。在较大的实例上迁移 mimetype 需要很长时间,因此升级期间不会自动完成此操作。使用命令 "occ Maintenance:repair --include-expensive" 执行迁移。
- 容器外,使用docker compose执行,这样会传递Redis环境变量
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ maintenance:repair --include-expensive
# 输出结果(确认没有错误输出)
- Repair MySQL collation
- All tables already have the correct collation -> nothing to do
- Clean tags and favorites
- 0 tags of deleted users have been removed.
- 0 tags for delete files have been removed.
- 0 tag entries for deleted tags have been removed.
- 0 tags with no entries have been removed.
......
app
- Add background job to check for backup codes
- Populating added database structures for workflows
维护窗口设置
服务器没有配置维护时段开始时间。 这意味着资源密集型日常后台作业也将在您的主要使用时间执行。 建议将其设置为低使用率的时间,这样用户就不会受到这些繁重任务造成的负载的影响。
- 容器外执行,设置后台任务为cron方式执行
- nextcloud镜像运行的容器,默认是没有安装cron的。此次设置是为了配合nextcloud任务定时方式,真实cron定时任务需要在宿主机配置(详见宿主机cron设置)。
- 注意:官方建议的cron频度是5分钟,如果是多个nextcloud节点,请在一个节点设置,或多个节点间隔合理时间设置。
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ background:cron
# 输出结果
Set mode for background jobs to 'cron'
- 容器外执行,设置维护窗口时间从凌晨1点开始
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:system:set maintenance_window_start --type integer --value 1
# 输出结果
System config value maintenance_window_start set to integer 1
bash
docker-compose exec -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/occ config:system:get maintenance_window_start
# 输出结果
1
宿主机cron设置
- Nextcloud Web界面定义(与上述 php -f /var/www/html/occ background:cron 命令行定义 功能相同)
- 虽然定义了之后不生效,但作用是为了取消AJAX或Webcron方式
- 不生效原因包括:默认人镜像未安装cron服务;如果手动安装cron服务,因环境变量缺失不工作(cron默认使用最基础系统环境变量)


- 改完使用宿主机cron定时任务
bash
cd /public/application/nextcloud
- 手动执行,验证命令
bash
docker compose exec -T -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/cron.php
# -u www-data:docker-compose exec 的参数,指定以 www-data 用户进入容器执行命令(这是正确的指定用户方式);
# -T:禁用伪终端(Cron 执行必需);
# php -f /var/www/html/cron.php:容器内执行的 PHP 命令(无多余参数,避免报错)。
- 定义宿主机cron
bash
crontab -l
@reboot /usr/sbin/ntpdate 192.168.5.254 > /dev/null 2>&1
0 */2 * * * /usr/sbin/ntpdate 192.168.5.254 > /dev/null 2>&1
30 */12 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# 每5分钟执行 Nextcloud Cron 任务(修正参数错误)
# 单台服务,每5分钟执行一次 Nextcloud Cron 任务(修正参数错误)
# 如果是两台,第1台0,10,20,30,40,50 ; 第2台5,15,25,35,45,55
*/5 * * * * cd /public/application/nextcloud && docker compose exec -T -u www-data nextcloud php -d memory_limit=1024M -f /var/www/html/cron.php >> /dev/null 2>&1
设置语言简体中文

遇到错误问题
无法关闭调试模式
-
提示运行在"调试模式",单无法关闭

-
原因是config.php中debug对应的是布尔变量(不是字符串)
- 设置成'false'了,正确应该是false,没有引号
bash
cat config.php | grep -C3 debug
'redis.timeout' => 3,
'maintenance' => false,
'maintenance_window_start' => 1,
'debug' => 'false',
);
- 使用命令重新配置
- 配置命令中明确定义类型 --type boolean
bash
docker compose exec -u www-data nextcloud php -d memory_limit=1024M /var/www/html/occ config:system:set debug --value=false --type boolean
# 命令输出结果
System config value debug set to boolean false
- 查看配置文件验证修改
bash
cat config.php | grep -C3 debug
'redis.timeout' => 3,
'maintenance' => false,
'maintenance_window_start' => 1,
'debug' => false,
);
- 配合设置日志等级为Warning
bash
docker compose exec -u www-data nextcloud php /var/www/html/occ config:system:set loglevel --value=2 --type=integer
| 数值 | 级别 | 说明 | 建议 |
|---|---|---|---|
| 0 | Debug | 调试模式,记录所有细节 | 仅在排查严重 bug 时开启,日志会爆炸 |
| 1 | Info | 记录一般信息 | 生产环境不建议,日志较多 |
| 2 | Warning | 默认值,记录警告和错误 | 推荐,平衡了信息量和性能 |
| 3 | Error | 仅记录错误 | 可能会漏掉一些重要的警告信息 |
| 4 | Fatal | 仅记录致命错误 | 不推荐,很难排查问题 |