部署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 仅记录致命错误 不推荐,很难排查问题
相关推荐
A小辣椒21 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式