部署Nextcloud与Onlyoffice(一)安装Nextcloud

概述

  1. Nextcloud与Onlyoffice主要解决公司内部文档存储与在线编辑问题,部署过程中涉及的问题比较多,故整理部署过程如下。
  2. 受限时间,只做了基础单点部署,后续有时间尝试Nextcloud与Onlyoffice的集群模式(主要解决Onlyoffice的多节点之间状态同步问题)

参考

  1. github: nextcloud / docker
  2. Nextcloud configuration
  3. Nextcloud Docker 容器化部署指南
  4. Nextcloud Docker环境变量完全指南
  5. linuxserver/nextcloud Docker镜像文档
  6. Nextcloud Docker 镜像使用介绍

环境

  1. 虚拟机

    • 8C/32G/200G 192.168.16.41 主节点
    • 8C/32G/200G 192.168.16.51 冷备节点
  2. 操作系统

    Ubuntu24.04

  3. 数据库

    • 172.28.3.12 主MySQL 8.4.8 和Redis 7.2.5
    • 172.28.3.6 从MySQL 8.4.8 和Redis 7.2.5
  4. 对象存储

    • Minio集群(因Minio社区版已进入维护期,后续考虑替换其它对象存储)
  5. 容器

    • docker

安装服务

Nextcloud安装步骤

  1. 创建外部数据库
  2. 创建外部对象存储
  3. 使用docker启动服务,服务使用外部数据库和对象存储

创建数据库

  1. 172.28.3.12和172.28.3.6服务器上预装好MySQL8.4.8和Redis7.2.5
  2. 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> 

创建对象存储

  1. 创建Minio的Bucket,Access Key,Secret Key

  2. 配置权限
    请自行查阅Minio相关文档

创建目录

  1. Nextcloud使用docker容器运行,宿主机需预创建挂载目录和自定义配置文件存储目录
  2. 目录结构如下
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文件

  1. 配置项说明:

    • 因为使用专用虚拟机运行nextcloud和onlyoffice,所以docker直接使用host网络模式,提升性能
    • nextcloud使用当前最新版镜像nextcloud:33.0.0
    • 使用外部MySQL数据库,便于提升性能和冷热备份。
    • 使用外部Redis数据库,便于提升性能和冷热备份,如果高负载请按官方建议使用Redis集群
    • 使用外部Minio存储,Minio是集群,使用为了保证数据的安全性
    • 服务相关配置,详见 docker-compose.yml中的说明
  2. 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冲突)

  1. 创建临时容器,拷贝
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
  1. 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>
  1. 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限制

  1. Apache:conf-enabled/nextcloud.conf 配置允许 2GB 和连接时长
  2. 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,出现一下提示:

  1. 检查当前信任域名
  • 默认只有初始化的一个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
  1. 手动添加信任域名
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
  1. 验证添加结果
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

http://192.168.16.41:8080

  1. 设置账号和密码(保持在数据库)

  2. 开始安装,等待完成

系统初始化完成

  1. 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
  1. 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)
  1. 验证对象存储配置
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

启用自定义配置

  1. 启用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/
  1. 重启nextcloud服务
bash 复制代码
docker compose up -d --force-recreate
[+] up 1/1
 ✔ Container nextcloud-server Started                           
  1. 验证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
  1. 进入容器查看 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"中

  1. 执行修复索引
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.
  1. 检查数据库,看是否有其它错误信息(表结构中匹配信息,请忽略。例如- 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" 执行迁移。

  1. 容器外,使用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

维护窗口设置

服务器没有配置维护时段开始时间。 这意味着资源密集型日常后台作业也将在您的主要使用时间执行。 建议将其设置为低使用率的时间,这样用户就不会受到这些繁重任务造成的负载的影响。

  1. 容器外执行,设置后台任务为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. 容器外执行,设置维护窗口时间从凌晨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设置

  1. Nextcloud Web界面定义(与上述 php -f /var/www/html/occ background:cron 命令行定义 功能相同)
  • 虽然定义了之后不生效,但作用是为了取消AJAX或Webcron方式
  • 不生效原因包括:默认人镜像未安装cron服务;如果手动安装cron服务,因环境变量缺失不工作(cron默认使用最基础系统环境变量)
  1. 改完使用宿主机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

设置语言简体中文

遇到错误问题

无法关闭调试模式

  1. 提示运行在"调试模式",单无法关闭

  2. 原因是config.php中debug对应的是布尔变量(不是字符串)

  • 设置成'false'了,正确应该是false,没有引号
bash 复制代码
cat config.php | grep -C3 debug
  'redis.timeout' => 3,
  'maintenance' => false,
  'maintenance_window_start' => 1,
  'debug' => 'false',
);
  1. 使用命令重新配置
  • 配置命令中明确定义类型 --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,
);
  1. 配合设置日志等级为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 仅记录致命错误 不推荐,很难排查问题
相关推荐
YXXY3132 小时前
基础IO的介绍(四)
linux
倔强的石头1062 小时前
【Linux指南】基础IO系列(五):重定向原理与 dup2 系统调用 —— 改变 IO 流向的魔法
linux·运维·服务器
吴烦恼的博客2 小时前
RK3588-kernel BringUp记录(二)
linux·kernel
阿正的梦工坊2 小时前
深入理解 Playwright 自动化脚本中的三个关键配置参数:无头模式,XVFB和持久化上下文
运维·自动化
-ONLY-¥2 小时前
HAProxy+Nginx高可用集群实战指南
linux
十年一梦实验室2 小时前
【Gemini & Nano banana】根据(F-35隐身战机)机器人与自动化产线机械、电气、软件及整体布局方案设计绘制综合方案图
运维·机器人·自动化
两点王爷2 小时前
在离线的Ubuntu机器中安装docker
运维·docker·容器
FS_Marking2 小时前
10G CWDM/DWDM SFP+光模块选购指南
运维·网络
Totoro-wen2 小时前
H20*8卡服务器装机指南
运维·服务器