构建一套高稳定性、响应极快且易于维护 的系统。为了完全替代群晖 Office(包含 Drive 文件管理 + Office 编辑),仅部署 OnlyOffice 核心是不够的,你需要一个“宿主”文件管理系统。
以下是为你量身定制的企业级私有云文档方案 :
一、 架构选型建议 要替代群晖套件,最成熟的开源组合是 Nextcloud + OnlyOffice Docs 。
文件管理层 (Nextcloud): 替代群晖 Drive。负责文件存储、权限管理、部门共享、PC端同步、手机APP。
编辑引擎层 (OnlyOffice Docs): 替代群晖 Office。负责浏览器端的 Excel/Word/PPT 在线协作编辑。
底层支撑: 使用虚拟化平台 (PVE/ESXi) + Docker 容器化部署。
二、 硬件规划 (基于 1-2 台 RH2288 V3) 由于 30 人并发对该服务器几乎没有负载压力,建议采用 “单机运行 + 异地/冷备” 或者 “虚拟化集群” 的策略,而不是复杂的双机热备(对于这个体量,热备增加了维护复杂度但收益不高)。
单机主力 + 备份机 (维护简单) 利用一台服务器作为主力,另一台作为备份存储或冷备机。
服务器 1 (主力):
OS: Proxmox VE (PVE) 或 ESXi。强烈建议不要直接装 Linux,一定要用虚拟化 ,方便快照和迁移。
存储: 做 RAID 10 (机械盘) 或 RAID 1 (SSD)。数据库建议跑在 SSD 上。
网络: 10GbE 接入核心交换机,供内网高速访问。
服务器 2 (备份):
安装 TrueNAS 或同样的 PVE。
每晚通过 PBS (Proxmox Backup Server) 或 Rsync 接收增量备份。
三、系统环境搭建 第一阶段:准备工作
下载debian12 os https://cdimage.debian.org/cdimage/archive/12.12.0/amd64/iso-cd/
上传 ISO: 登录 PVE 管理后台 -> 点击左侧存储(通常是 local) -> ISO Images -> Upload -> 选择下载好的 ISO。
第二阶段:在 PVE 中创建虚拟机 (VM)
3.2 pve安装debian12
按以下参数配置,以获得最佳性能:
常规 (General):
VM ID: 自动生成(如 100)。
Name: DocServer (或者你喜欢的名字)。
操作系统 (OS):
ISO Image: 选择刚才上传的 Debian ISO。
Type: Linux, Kernel 6.x。
系统 (System):
Graphic card: Default (或者 Serial terminal 0 如果你习惯命令行,默认即可)。
Qemu Agent: 勾选 (重要!这让 PVE 能看到虚拟机的 IP 和内存占用,并能优雅关机)。
磁盘 (Disks):
Bus/Device: SCSI (配合 VirtIO SCSI 控制器性能最好)。
Storage: 选择你的存储位置。
Disk size: 建议 100GB+ (Nextcloud 产生的数据主要挂载在外部或单独的数据盘,系统盘 100G 足够 Docker 镜像和日志使用)。
SSD Emulation: 如果底层是 SSD,请勾选。
Discard: 勾选 (开启 TRIM,延长 SSD 寿命)。
CPU:
Sockets: 1-2 (RH2288 是双路服务器)。
Cores: 4-8 (总共给 8-16 核没问题,反正空闲时不占资源)。
Type: Host (非常重要!直接透传物理 CPU 指令集,性能最好,不要用默认的 kvm64)。
内存 (Memory):
Memory: 16384 (16GB)。
Ballooning Device: 勾选 (允许 PVE 动态回收空闲内存)。
网络 (Network):
Bridge: vmbr0。
Model: VirtIO (paravirtualized) (必须选这个,才能跑满你的万兆网卡)。
第三阶段:Debian 安装过程 (关键步骤) 启动虚拟机,进入控制台 (Console) 开始安装:
语言选择: 建议选 English (服务器选中文在 SSH 终端容易乱码),地区选 China (为了时区和镜像源)。
主机名 (Hostname): docserver。
Root 密码: 设置一个复杂的密码。
新建普通用户: 创建一个非 root 用户(例如 admin)。
分区 (Partition disks):
选择 Guided - use entire disk (向导 - 使用整块磁盘)。
如果为了简单,选 All files in one partition (所有文件在一个分区)。
软件选择 (Software selection) —— 最关键的一步! 系统会自动弹出菜单让你选择要安装的软件,请只勾选以下两项,其余全部取消勾选 :
等待安装完成,虚拟机自动重启。
第四阶段:安装后配置 (初始化环境) 通过 SSH 工具(如 Putty, Termius)连接到服务器 IP(如果在安装时没看到 IP,可以在 PVE 界面看,或者在虚拟机控制台登录输入 ip addr 查看)。
1. 设置国内源 (提升下载速度) 默认情况下如果选择中国地区,会提示你选择国内源,此步骤不用
Debian 默认源在国内可能较慢,建议替换为清华源或中科大源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 切换到 root su - # 备份原配置 cp /etc/apt/sources.list /etc/apt/sources.list.bak # 写入清华源 (针对 Debian 12 Bookworm) cat > /etc/apt/sources.list <<EOF deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware EOF # 更新系统 apt update && apt upgrade -y
安装基础工具与 QEMU Agent
1 2 3 4 # qemu-guest-agent: 让PVE能管理虚拟机 # curl, wget, git: 常用工具 # vim/nano: 编辑器 apt install -y qemu-guest-agent curl wget git vim htop
安装完 qemu-guest-agent 后,建议在 PVE 界面重启一下这台虚拟机,你会发现 PVE 的“摘要”页面能直接看到虚拟机的 IP 地址了。
如果之前pve创建虚拟机勾选了qemu选项那么这里直接可以看到ip。

3. 安装 Docker (使用官方源) 不要直接用 apt install docker.io,那个版本通常较旧。推荐使用 Docker 官方脚本安装:
1 2 3 4 5 6 7 8 9 # 1. 自动安装脚本 (使用阿里云镜像加速,适合国内网络) curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 2. 启动 Docker 并设置开机自启 systemctl enable --now docker # 3. 安装 Docker Compose (新版 Docker 已内置 compose 插件,命令是 docker compose) docker compose version # 如果能看到版本号,说明安装成功
优化网络参数 (针对万兆网卡和 OnlyOffice)
编辑 /etc/sysctl.conf,在末尾添加以下优化参数:
1 2 3 4 5 6 7 8 9 10 # 增加连接追踪表大小 (防止并发高时丢包) net.netfilter.nf_conntrack_max = 131072 # 开启 BBR 拥塞控制 (提升网络吞吐效率) net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # 允许更多的 Redis 连接 (OnlyOffice/Nextcloud 需要) net.core.somaxconn = 4096 vm.overcommit_memory = 1
应用配置:
四、服务搭建 4.1 目录规划 对于服务器环境,文件存放的位置直接关系到后续的维护难度 、数据安全 以及备份的便利性 。
结论: 既不要放在 /root 下,也不要放在 /home/bg4vrg 下。
建议: 在根目录下新建一个独立的 /data 目录(或者叫 /opt/office)。
为什么这样做?
**避开 /root**:这是系统管理员的私宅,权限极其严格,万一将来你需要设置自动备份脚本,或者让别人帮忙维护,放在这里会很麻烦。
**避开 /home/bg4vrg**:这是个人用户的家目录。如果你以后删除了这个用户,或者系统权限变动,服务可能会受到影响。服务应该属于“系统”,而不是某个“人”。
**使用独立目录 (/data)**:
逻辑清晰 :一眼就知道这里面放的是应用数据。
方便挂载 :如果你以后在 PVE 里给虚拟机增加了一块 2TB 的虚拟硬盘,你可以直接把它挂载到 /data,而不需要迁移整个操作系统。
方便备份 :备份时只需要打包 /data 目录,不用担心漏掉东西。
具体操作步骤与目录规划 请以 Root 身份 执行以下操作,我们将构建一套符合企业运维标准的目录结构。
1. 创建主目录 我们将所有与此次 OnlyOffice/Nextcloud 相关的配置文件和数据都放在 /data/office-server 下。
Bash
1 2 3 # 1. 创建并进入目录 mkdir -p /data/office-server cd /data/office-server
2. 规划子目录结构 为了让 OnlyOffice 和 Nextcloud 的数据井水不犯河水,我们提前建立好文件夹。
请查看下面的目录结构图:
Plaintext
1 2 3 4 5 6 7 8 9 /data/office-server/ <-- [项目根目录] docker-compose.yml 放在这里 ├── nextcloud_data/ <-- [核心数据] 存放所有 Excel/Word 文档、用户图片等 ├── db_data/ <-- [数据库] Postgres 数据库文件 ├── redis_data/ <-- [缓存] Redis 缓存数据 (可选,但建议有) └── onlyoffice_data/ <-- [编辑引擎] OnlyOffice 的相关数据 ├── logs/ <-- 日志 (报错时看这里) ├── data/ <-- 缓存和临时文件 ├── lib/ <-- 核心库数据 └── db/ <-- OnlyOffice 自带的简单数据库 (如果用内置的话)
3. 执行创建命令 你可以直接复制下面这行命令,一次性把这些文件夹建好:
Bash
1 mkdir -p nextcloud_data db_data redis_data onlyoffice_data/logs onlyoffice_data/data onlyoffice_data/lib onlyoffice_data/db
更新后的 docker-compose.yml 现在我们有了明确的路径,我们需要更新之前的配置文件,把路径显式地映射 进去。这样哪怕你把 Docker 删了重装,只要 /data 目录还在,你的数据就丢不了。
请在 /data/office-server 目录下创建文件:
Bash
复制并粘贴以下内容(针对你的目录结构做了精准适配):
YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 version: '3' services: # --- 数据库服务 --- db: image: postgres:15-alpine restart: always container_name: office_db volumes: - ./db_data:/var/lib/postgresql/data # 映射到我们要的目录 environment: - POSTGRES_DB=nextcloud - POSTGRES_USER=nc_user - POSTGRES_PASSWORD=YOUR_STRONG_PASSWORD # 【注意】请修改这里的密码 # --- 缓存服务 --- redis: image: redis:alpine restart: always container_name: office_redis volumes: - ./redis_data:/data # --- Nextcloud (网盘主程序) --- app: image: nextcloud:fpm-alpine restart: always container_name: office_nextcloud volumes: - ./nextcloud_data:/var/www/html # 映射核心数据目录 environment: - POSTGRES_HOST=db - REDIS_HOST=redis depends_on: - db - redis # --- Web 服务器 (Nginx) --- web: image: nginx:alpine restart: always container_name: office_web ports: - 80:80 # 宿主机80端口 -> 容器80端口 volumes: - ./nextcloud_data:/var/www/html:ro # 只读映射静态文件 - ./nginx.conf:/etc/nginx/nginx.conf:ro # 需要单独创建这个配置文件 depends_on: - app # --- OnlyOffice (文档编辑引擎) --- onlyoffice: image: onlyoffice/documentserver:latest restart: always ports: - "8080:80" # 【新增】将宿主机 8080 端口映射到容器 80 container_name: office_documentserver environment: - JWT_ENABLED=true - JWT_SECRET=YOUR_JWT_SECRET # 【注意】请修改这个密钥,后面Nextcloud里要填一样的 volumes: - ./onlyoffice_data/logs:/var/log/onlyoffice - ./onlyoffice_data/data:/var/www/onlyoffice/Data - ./onlyoffice_data/lib:/var/lib/onlyoffice
接下来你还需要做一件事:Nginx 配置 上面的配置里引用了一个 nginx.conf。因为 Nextcloud 的 FPM 版本性能最好,但需要 Nginx 来配合。
在同级目录下创建文件:
Bash
这里需要填入 Nextcloud 官方推荐的 Nginx 配置。由于配置较长,如果你准备好了,请告诉我,我发给你一份精简可用且优化过上传大小限制 的配置内容。
这份配置专门针对 Nextcloud FPM + Docker 环境进行了调整,解决了以下关键问题:
大文件上传 :将上传限制放宽到了 10GB(避免上传大视频或大量 Excel 时报错)。
超时优化 :延长了脚本执行时间,防止 Nextcloud 处理大文件时断开连接。
安全性 :添加了 HSTS 和禁止嗅探等安全头。
1. 创建配置文件 请在 /data/office-server 目录下创建文件:
Bash
2. 粘贴以下内容 按 i 进入编辑模式,粘贴全部内容,然后按 Esc -> 输入 :wq 保存退出。
Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 worker_processes auto; events { worker_connections 2048; use epoll; } http { include mime.types; default_type application/octet-stream; # --- 基础日志配置 --- access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn; # --- 性能优化 --- sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # --- 大文件上传关键配置 --- # 这里设置为 10G,配合 php 的设置,保证大文件传输 client_max_body_size 10G; client_body_timeout 300s; fastcgi_buffers 64 4K; # --- Gzip 压缩 (提升加载速度) --- gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 4; gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml; # --- PHP 处理器指向 (对应 docker-compose 里的 app 服务名) --- upstream php-handler { server app:9000; } server { listen 80; # 你的服务器IP或域名,如果有域名请修改这里 server_name localhost; root /var/www/html; index index.php index.html /index.php$request_uri; # --- 安全头设置 --- add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; add_header X-Download-Options noopen; add_header X-Permitted-Cross-Domain-Policies none; add_header Referrer-Policy no-referrer; # --- 核心路由规则 --- location / { try_files $uri $uri/ /index.php$request_uri; } location = /robots.txt { allow all; log_not_found off; access_log off; } # 屏蔽敏感目录 location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ { deny all; } location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } # 处理 PHP 请求 location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v1|ocs\/v2)\.php(?:$|\/) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; # 如果你在反代后面用 https,这里可能需要改为 on fastcgi_param HTTPS off; fastcgi_param modHeadersAvailable true; fastcgi_param front_controller_active true; fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; # 延长 PHP 执行时间防止大文件处理超时 fastcgi_read_timeout 300; } # 处理静态资源缓存 location ~ \.(?:css|js|woff2?|svg|gif|map)$ { try_files $uri /index.php$request_uri; add_header Cache-Control "public, max-age=15778463"; # 重复添加安全头以确保覆盖 add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; access_log off; } location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ { try_files $uri /index.php$request_uri; access_log off; } } }
总结
Nginx 负责 :让用户通过 80 端口访问文件网盘 (Nextcloud)。
端口映射负责 :让用户通过 8080 端口获取编辑服务 (OnlyOffice)。
配置完成后,输入 docker compose up -d 启动所有服务。
启动后,访问 http://你的服务器IP 就能看到 Nextcloud 的安装界面了。安装完 Nextcloud 后,我们还需要最后一步:安装 OnlyOffice 插件并填入地址 。
如果出现以下提示
1 2 WARN[0000] /data/office-server/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
在以前的 Docker 版本中,我们必须在文件第一行写上 version: '3' 来告诉 Docker 用哪套语法。 但在最新的 Docker Compose V2 标准中,这个 version 字段已经被废弃了(Obsolete),因为 Docker 现在足够智能,能自动识别配置文件。它现在的策略是:“我知道这个字段没用了,我会忽略它,但建议你把它删了以免混淆。”
所以可以删除version那行,或者无视。
如果出现以下报错,那是docker服务在国内被阻断了,需要设置代理地址

第一步:确认你的代理地址 你需要知道你代理服务器的 内网 IP 和 端口 。
假设你的代理软件运行在某台 PC 上(IP 为 192.168.1.100),端口是 7890。
注意: 请务必在你的代理软件设置中开启 **“允许局域网连接” (Allow LAN)**,否则虚拟机无法连上它。
第二步:创建 Docker 代理配置文件 在 Debian 终端中(使用 Root 身份)执行以下操作:
创建配置目录:
Bash
1 mkdir -p /etc/systemd/system/docker.service.d
创建并编辑代理文件:
Bash
1 vim /etc/systemd/system/docker.service.d/http-proxy.conf
填入以下内容(请修改为你的实际代理 IP 和端口):
Ini, TOML
1 2 3 4 5 6 [Service] # 注意:HTTP_PROXY 和 HTTPS_PROXY 都要填,通常都填 http:// 开头的代理地址即可 Environment="HTTP_PROXY=http://192.168.x.x:端口" Environment="HTTPS_PROXY=http://192.168.x.x:端口" # 下面这行很重要,防止本地容器间的通信也走了代理导致出错 Environment="NO_PROXY=localhost,127.0.0.1,::1,.local"
示例:如果你的代理在 192.168.50.5,端口 7890,就填 http://192.168.50.5:7890
保存退出: 按 Esc,输入 :wq 回车。
第三步:重载配置并重启 Docker 配置改完必须重启服务才能生效:
Bash
1 2 3 4 5 6 7 8 # 1. 重载系统服务配置 systemctl daemon-reload # 2. 重启 Docker 服务 systemctl restart docker # 3. (可选) 验证配置是否生效 docker info | grep Proxy
如果你看到输出了你刚才设置的 IP,说明配置成功了。

第四步:重新拉取镜像 现在,你可以再次运行之前的命令,速度应该会飞快:
Bash
1 2 3 cd /data/office-server docker compose down # 先清理一下之前的失败状态 docker compose up -d # 再次启动
💡 常见坑点排查 如果你配置了代理但依然报错 connection refused 或 timeout:
代理软件没开“允许局域网”: 这是最常见的原因。你的 PC 防火墙挡住了虚拟机的连接。
别忘记代理服务端的机器要放行7890端口
IP 填错了: 不要在配置文件里填 127.0.0.1,除非代理软件就装在这台 Debian 虚拟机里面。如果代理在宿主机或另一台电脑,一定要填那个设备的局域网 IP。
测试连通性: 你可以先用 curl 测试一下虚拟机能不能连上代理
Bash
1 2 # 替换为你的代理IP和端口 curl -v -x http://192.168.x.x:端口 https://www.google.com
如果这一步通了,Docker 就一定能通。

五、nextcloud配置 通过访问虚拟机ip已经可以进入nexcloud的首次配置页面

喜你!能看到这个界面说明所有的容器都已经正常启动,且 Nginx 反向代理配置完全正确 。这是最关键的一步。
现在你需要正确填写这个安装向导,千万不要直接点安装 ,否则会默认使用性能极差的 SQLite 数据库,导致我们辛辛苦苦部署的 PostgreSQL 数据库被闲置。
请按照以下步骤填写:
1. 创建管理员账号 (Create administration account)
Administration account name : 设置一个管理员用户名(例如 admin)。
Administration account password : 设置一个强密码,并务必记住它 。
2. 数据目录 (Data folder)
保持默认的 /var/www/html/data 不动 。
(解释:我们在 docker-compose.yml 里已经把宿主机的 ./nextcloud_data 映射到了容器的 /var/www/html,所以这个默认路径实际上就是存在你硬盘上的 nextcloud_data/data 目录里,非常安全。)
3. 数据库配置 (Database configuration) —— 最关键的一步
**点击选择 “PostgreSQL”**:(千万别选默认的 SQLite,那个带不动 200 人)。
填写数据库信息 (这些信息来自你之前的 docker-compose.yml 配置):
Database user (数据库用户) : nc_user
Database password (数据库密码) : 填入你在 yaml 文件里设置的那个密码
Database name (数据库名称) : nextcloud
Database host (数据库主机) : db
*(注意 :这里一定要填 db,不要填 localhost 或 IP。因为在 Docker 网络里,容器之间是用服务名互相访问的。)*
4. 只有当上面都填好后,再点击底部的 “Install” (安装)。
安装可能需要 1-2 分钟,请耐心等待页面跳转。

安装完成后页面跳转到系统应用商店,但是因为国内网络问题,显示是空白的。
看到的界面是 Nextcloud 的“推荐应用安装向导”。
原因: 你的 Nextcloud 容器正在尝试连接 Nextcloud 的官方应用商店(服务器在国外),试图拉取推荐的应用列表。
故障: 就像之前 Docker 拉取镜像一样,因为网络原因(墙),容器内部无法连接到应用商店,导致请求超时,卡在这个页面并报错“无法获取应用列表”。
此前我们在 Docker 层面设置的代理,只对“拉取镜像”有效,容器运行起来后,Nextcloud 这个程序本身并不知道有代理存在。
第一步:跳过这个卡死的页面 不需要在这里纠结,我们直接绕过它进入主界面。
修改浏览器地址栏: 把地址栏里的后缀 /index.php/core/apps/recommended 删掉。 直接访问: http://10.139.27.98/ 或者: http://10.139.27.98/index.php/apps/files
回车后,你应该就能直接看到 Nextcloud 的蓝色文件管理主界面了。
第二步:给 Nextcloud 配置代理 (为了安装 OnlyOffice 插件) 虽然你进了主页,但如果不配置代理,你一会儿去“应用中心”下载 OnlyOffice 连接器时还是会失败。我们需要修改 Nextcloud 的配置文件,告诉它“请走代理”。
请回到 SSH 终端(Root 身份):
编辑配置文件: 该文件位于我们在 docker-compose.yml 中映射的目录里。
Bash
1 vim /data/office-server/nextcloud_data/config/config.php
添加代理代码: 在文件的最后部分,但在 ); (最后一行)之前 ,插入下面这行配置。 (请把 192.168.x.x:端口 替换成和你之前配置 Docker 代理时完全一样的 IP 和端口)
PHP
1 2 3 // 添加这两行 'proxy' => '192.168.x.x:端口', 'proxyexclude' => ['localhost', '127.0.0.1', 'db', 'redis', 'onlyoffice'],
修改后的文件看起来应该像这样(注意逗号):
PHP
1 2 3 4 5 6 7 8 9 10 <?php $CONFIG = array ( 'htaccess.RewriteBase' => '/', 'memcache.local' => '\\OC\\Memcache\\APCu', // ... 其他原有配置 ... 'version' => '28.0.0.11', // 插入在这里: 'proxy' => '192.168.50.5:7890', 'proxyexclude' => ['localhost', '127.0.0.1', 'db', 'redis', 'onlyoffice'], );
保存退出: (Esc -> :wq)。
无需重启: Nextcloud 的 PHP 配置文件是即时生效的,不需要重启 Docker。
第三步:安装并连接 OnlyOffice 配置好代理后,我们就可以正式把这两个强大的软件连起来了。
进入 Nextcloud 应用商店:
在网页右上角点击你的头像 -> **应用 (Apps)**。
此时因为配了代理,页面应该加载得很快(左侧会出现应用分类)。
搜索插件:
点击右上角的放大镜图标,搜索 ONLYOFFICE。
找到 “ONLYOFFICE” (官方连接器),点击 **”下载并启用” (Download and enable)**。
配置连接:
安装完成后,点击右上角头像 -> **管理设置 (Administration settings)**。
在左侧菜单栏向下滚动,找到 **”ONLYOFFICE”**(在“管理”分类下)。
填写服务器地址 (ONLYOFFICE Docs address): 这里有一个关键点:因为是在 Docker 内部互相访问,不能填 localhost,也不能填宿主机 IP(容易被防火墙挡)。要填 Docker 的服务名。
地址栏填写: http://onlyoffice
(解释:Docker 会自动把这个域名解析到 OnlyOffice 那个容器)
密钥 (Secret key): 填入你在 docker-compose.yml 里设置的那个 JWT_SECRET(如果你没改,就是 YOUR_JWT_SECRET)。
点击 **”保存” (Save)**。
小结:因为使用了代理,所以gemini给的配置文件有坑,需要不断排错。比如docker默认的php进程太少,需要增加;nextcloud、onlyoffice的目录权限。
此外,排错过程会经常使用到以下命令查看日志,其中office_documentserver是容器名,可按实际情况改变。
1 docker logs office_documentserver --tail 20
最后onlyoffice插件设置如下:

nextcloud的php配置代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 <?php $CONFIG = array ( 'memcache.local' => '\\OC\\Memcache\\APCu', 'apps_paths' => array ( 0 => array ( 'path' => '/var/www/html/apps', 'url' => '/apps', 'writable' => false, ), 1 => array ( 'path' => '/var/www/html/custom_apps', 'url' => '/custom_apps', 'writable' => true, ), ), 'memcache.distributed' => '\\OC\\Memcache\\Redis', 'memcache.locking' => '\\OC\\Memcache\\Redis', 'redis' => array ( 'host' => 'redis', 'password' => '', 'port' => 6379, ), 'upgrade.disable-web' => true, 'instanceid' => 'ocedlxneybp2', 'passwordsalt' => 'mnsMUnOMTkkgSF421ysyFfSNfYLFzK', 'secret' => 'k5ZSt3VK4N2PkGRYEcRgewZjThdTN0WoiyveTCIGosyGoEnn', 'trusted_domains' => array ( 0 => '10.139.27.98', 1 => 'office_web', // 【新增】Docker 内部容器名 2 => 'web', ), 'datadirectory' => '/var/www/html/data', 'dbtype' => 'pgsql', 'version' => '32.0.3.2', 'overwrite.cli.url' => 'http://10.139.27.98', 'dbname' => 'nextcloud', 'dbhost' => 'db', 'dbtableprefix' => 'oc_', 'dbuser' => 'oc_admin', 'dbpassword' => 'qFaL41XHHiUgSmweySKvZZhIrQ0pqO', 'installed' => true, // 添加这两行 'proxy' => '10.139.27.5:7890', 'proxyexclude' => ['localhost', '127.0.0.1', 'db', 'redis', 'onlyoffice', 'web'], // 允许从本地/内网下载文件 (解决 Error while downloading 问题) 'allow_local_remote_servers' => true, );
部署容器yml文件最终如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #version: '3' services: # --- 数据库服务 --- db: image: postgres:15-alpine restart: always container_name: office_db volumes: - ./db_data:/var/lib/postgresql/data # 映射到我们要的目录 environment: - POSTGRES_DB=nextcloud - POSTGRES_USER=nc_user - POSTGRES_PASSWORD=Sq84354163 # 【注意】请修改这里的密码 # --- 缓存服务 --- redis: image: redis:alpine restart: always container_name: office_redis volumes: - ./redis_data:/data # --- Nextcloud (网盘主程序) --- app: image: nextcloud:fpm-alpine restart: always container_name: office_nextcloud volumes: - ./nextcloud_data:/var/www/html # 映射核心数据目录 environment: - POSTGRES_HOST=db - REDIS_HOST=redis - PM_MAX_CHILDREN=50 - PM_START_SERVERS=10 depends_on: - db - redis # --- Web 服务器 (Nginx) --- web: image: nginx:alpine restart: always container_name: office_web ports: - 80:80 # 宿主机80端口 -> 容器80端口 volumes: - ./nextcloud_data:/var/www/html:ro # 只读映射静态文件 - ./nginx.conf:/etc/nginx/nginx.conf:ro # 需要单独创建这个配置文件 depends_on: - app # --- OnlyOffice (文档编辑引擎) --- onlyoffice: image: onlyoffice/documentserver:latest restart: always ports: - "8080:80" # 【新增】将宿主机 8080 端口映射到容器 80 container_name: office_documentserver environment: - JWT_ENABLED=true - JWT_SECRET=yishanyishanliangjingjing # 【注意】请修改这个密钥,后面Nextcloud里要填一样的 volumes: - ./onlyoffice_data/logs:/var/log/onlyoffice - ./onlyoffice_data/data:/var/www/onlyoffice/Data - ./onlyoffice_data/lib:/var/lib/onlyoffice
ngix配置最终
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 worker_processes auto; events { worker_connections 2048; use epoll; } http { include mime.types; default_type application/octet-stream; # --- 基础日志配置 --- access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn; # --- 性能优化 --- sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # --- 大文件上传关键配置 --- # 这里设置为 10G,配合 php 的设置,保证大文件传输 client_max_body_size 10G; client_body_timeout 300s; fastcgi_buffers 64 4K; # --- Gzip 压缩 (提升加载速度) --- gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 4; gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml; # --- PHP 处理器指向 (对应 docker-compose 里的 app 服务名) --- upstream php-handler { server app:9000; } server { listen 80; # 你的服务器IP或域名,如果有域名请修改这里 server_name localhost; root /var/www/html; index index.php index.html /index.php$request_uri; # --- 安全头设置 --- add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; add_header X-Download-Options noopen; add_header X-Permitted-Cross-Domain-Policies none; add_header Referrer-Policy no-referrer; # --- 核心路由规则 --- location / { try_files $uri $uri/ /index.php$request_uri; } location = /robots.txt { allow all; log_not_found off; access_log off; } # 屏蔽敏感目录 location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ { deny all; } location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } # 处理 PHP 请求 location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v1|ocs\/v2)\.php(?:$|\/) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; # 如果你在反代后面用 https,这里可能需要改为 on fastcgi_param HTTPS off; fastcgi_param modHeadersAvailable true; fastcgi_param front_controller_active true; fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; # 延长 PHP 执行时间防止大文件处理超时 fastcgi_read_timeout 300; } # 处理静态资源缓存 location ~ \.(?:css|js|woff2?|svg|gif|map)$ { try_files $uri /index.php$request_uri; add_header Cache-Control "public, max-age=15778463"; # 重复添加安全头以确保覆盖 add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; access_log off; } location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ { try_files $uri /index.php$request_uri; access_log off; } } }