pve搭建onlyoffice

​ 构建一套高稳定性、响应极快且易于维护的系统。为了完全替代群晖 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

按以下参数配置,以获得最佳性能:

  1. 常规 (General):
    • VM ID: 自动生成(如 100)。
    • Name: DocServer (或者你喜欢的名字)。
  2. 操作系统 (OS):
    • ISO Image: 选择刚才上传的 Debian ISO。
    • Type: Linux, Kernel 6.x。
  3. 系统 (System):
    • Graphic card: Default (或者 Serial terminal 0 如果你习惯命令行,默认即可)。
    • Qemu Agent: 勾选 (重要!这让 PVE 能看到虚拟机的 IP 和内存占用,并能优雅关机)。
  4. 磁盘 (Disks):
    • Bus/Device: SCSI (配合 VirtIO SCSI 控制器性能最好)。
    • Storage: 选择你的存储位置。
    • Disk size: 建议 100GB+ (Nextcloud 产生的数据主要挂载在外部或单独的数据盘,系统盘 100G 足够 Docker 镜像和日志使用)。
    • SSD Emulation: 如果底层是 SSD,请勾选。
    • Discard: 勾选 (开启 TRIM,延长 SSD 寿命)。
  5. CPU:
    • Sockets: 1-2 (RH2288 是双路服务器)。
    • Cores: 4-8 (总共给 8-16 核没问题,反正空闲时不占资源)。
    • Type: Host (非常重要!直接透传物理 CPU 指令集,性能最好,不要用默认的 kvm64)。
  6. 内存 (Memory):
    • Memory: 16384 (16GB)。
    • Ballooning Device: 勾选 (允许 PVE 动态回收空闲内存)。
  7. 网络 (Network):
    • Bridge: vmbr0。
    • Model: VirtIO (paravirtualized) (必须选这个,才能跑满你的万兆网卡)。

第三阶段:Debian 安装过程 (关键步骤)

启动虚拟机,进入控制台 (Console) 开始安装:

  1. 语言选择: 建议选 English (服务器选中文在 SSH 终端容易乱码),地区选 China (为了时区和镜像源)。
  2. 主机名 (Hostname): docserver
  3. Root 密码: 设置一个复杂的密码。
  4. 新建普通用户: 创建一个非 root 用户(例如 admin)。
  5. 分区 (Partition disks):
    • 选择 Guided - use entire disk (向导 - 使用整块磁盘)。
    • 如果为了简单,选 All files in one partition (所有文件在一个分区)。
  6. 软件选择 (Software selection) —— 最关键的一步! 系统会自动弹出菜单让你选择要安装的软件,请只勾选以下两项,其余全部取消勾选
    • Debian desktop environment (千万别选,服务器不需要图形界面)
    • GNOME … (不选)
    • SSH server (必选,否则无法远程连接)
    • Standard system utilities (必选,基础工具)
  7. 等待安装完成,虚拟机自动重启。

第四阶段:安装后配置 (初始化环境)

通过 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
  1. 安装基础工具与 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。

![image-20260110175946440](F:\Program Files\PortableGit\blog\source\pic\image-20260110175946440.png)

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
# 如果能看到版本号,说明安装成功
  1. 优化网络参数 (针对万兆网卡和 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

应用配置:

1
sysctl -p

四、服务搭建

4.1 目录规划

对于服务器环境,文件存放的位置直接关系到后续的维护难度数据安全以及备份的便利性

结论: 既不要放在 /root 下,也不要放在 /home/bg4vrg 下。

建议: 在根目录下新建一个独立的 /data 目录(或者叫 /opt/office)。

为什么这样做?

  1. **避开 /root**:这是系统管理员的私宅,权限极其严格,万一将来你需要设置自动备份脚本,或者让别人帮忙维护,放在这里会很麻烦。
  2. **避开 /home/bg4vrg**:这是个人用户的家目录。如果你以后删除了这个用户,或者系统权限变动,服务可能会受到影响。服务应该属于“系统”,而不是某个“人”。
  3. **使用独立目录 (/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

1
vim docker-compose.yml

复制并粘贴以下内容(针对你的目录结构做了精准适配):

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 来配合。

  1. 在同级目录下创建文件:

    Bash

    1
    vim nginx.conf
  2. 这里需要填入 Nextcloud 官方推荐的 Nginx 配置。由于配置较长,如果你准备好了,请告诉我,我发给你一份精简可用且优化过上传大小限制的配置内容。

这份配置专门针对 Nextcloud FPM + Docker 环境进行了调整,解决了以下关键问题:

  1. 大文件上传:将上传限制放宽到了 10GB(避免上传大视频或大量 Excel 时报错)。
  2. 超时优化:延长了脚本执行时间,防止 Nextcloud 处理大文件时断开连接。
  3. 安全性:添加了 HSTS 和禁止嗅探等安全头。

1. 创建配置文件

请在 /data/office-server 目录下创建文件:

Bash

1
vim nginx.conf

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;
}
}
}

总结

  1. Nginx 负责:让用户通过 80 端口访问文件网盘 (Nextcloud)。
  2. 端口映射负责:让用户通过 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服务在国内被阻断了,需要设置代理地址

![image-20260110184257864](F:\Program Files\PortableGit\blog\source\pic\image-20260110184257864.png)

第一步:确认你的代理地址

你需要知道你代理服务器的 内网 IP端口

  • 假设你的代理软件运行在某台 PC 上(IP 为 192.168.1.100),端口是 7890
  • 注意: 请务必在你的代理软件设置中开启 **“允许局域网连接” (Allow LAN)**,否则虚拟机无法连上它。

第二步:创建 Docker 代理配置文件

在 Debian 终端中(使用 Root 身份)执行以下操作:

  1. 创建配置目录:

    Bash

    1
    mkdir -p /etc/systemd/system/docker.service.d
  2. 创建并编辑代理文件:

    Bash

    1
    vim /etc/systemd/system/docker.service.d/http-proxy.conf
  3. 填入以下内容(请修改为你的实际代理 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
  4. 保存退出: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,说明配置成功了。

![image-20260110184427861](F:\Program Files\PortableGit\blog\source\pic\image-20260110184427861.png)

第四步:重新拉取镜像

现在,你可以再次运行之前的命令,速度应该会飞快:

Bash

1
2
3
cd /data/office-server
docker compose down # 先清理一下之前的失败状态
docker compose up -d # 再次启动

💡 常见坑点排查

如果你配置了代理但依然报错 connection refusedtimeout

  1. 代理软件没开“允许局域网”: 这是最常见的原因。你的 PC 防火墙挡住了虚拟机的连接。

  2. 别忘记代理服务端的机器要放行7890端口

  3. IP 填错了: 不要在配置文件里填 127.0.0.1,除非代理软件就装在这台 Debian 虚拟机里面。如果代理在宿主机或另一台电脑,一定要填那个设备的局域网 IP。

  4. 测试连通性: 你可以先用 curl 测试一下虚拟机能不能连上代理

    Bash

    1
    2
    # 替换为你的代理IP和端口
    curl -v -x http://192.168.x.x:端口 https://www.google.com

    如果这一步通了,Docker 就一定能通。

![image-20260110184900156](F:\Program Files\PortableGit\blog\source\pic\image-20260110184900156.png)

五、nextcloud配置

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

![image-20260110190258574](F:\Program Files\PortableGit\blog\source\pic\image-20260110190258574.png)

喜你!能看到这个界面说明所有的容器都已经正常启动,且 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) —— 最关键的一步

  1. **点击选择 “PostgreSQL”**:(千万别选默认的 SQLite,那个带不动 200 人)。
  2. 填写数据库信息(这些信息来自你之前的 docker-compose.yml 配置):
    • Database user (数据库用户): nc_user
    • Database password (数据库密码): 填入你在 yaml 文件里设置的那个密码
    • Database name (数据库名称): nextcloud
    • Database host (数据库主机): db
      • *(注意:这里一定要填 db,不要填 localhost 或 IP。因为在 Docker 网络里,容器之间是用服务名互相访问的。)*

4. 只有当上面都填好后,再点击底部的 “Install” (安装)。


安装可能需要 1-2 分钟,请耐心等待页面跳转。

![image-20260110190602476](F:\Program Files\PortableGit\blog\source\pic\image-20260110190602476.png)

安装完成后页面跳转到系统应用商店,但是因为国内网络问题,显示是空白的。

看到的界面是 Nextcloud 的“推荐应用安装向导”。

  • 原因: 你的 Nextcloud 容器正在尝试连接 Nextcloud 的官方应用商店(服务器在国外),试图拉取推荐的应用列表。
  • 故障: 就像之前 Docker 拉取镜像一样,因为网络原因(墙),容器内部无法连接到应用商店,导致请求超时,卡在这个页面并报错“无法获取应用列表”。

此前我们在 Docker 层面设置的代理,只对“拉取镜像”有效,容器运行起来后,Nextcloud 这个程序本身并不知道有代理存在。


第一步:跳过这个卡死的页面

不需要在这里纠结,我们直接绕过它进入主界面。

  1. 修改浏览器地址栏: 把地址栏里的后缀 /index.php/core/apps/recommended 删掉。 直接访问: http://10.139.27.98/ 或者: http://10.139.27.98/index.php/apps/files
  2. 回车后,你应该就能直接看到 Nextcloud 的蓝色文件管理主界面了。

第二步:给 Nextcloud 配置代理 (为了安装 OnlyOffice 插件)

虽然你进了主页,但如果不配置代理,你一会儿去“应用中心”下载 OnlyOffice 连接器时还是会失败。我们需要修改 Nextcloud 的配置文件,告诉它“请走代理”。

请回到 SSH 终端(Root 身份):

  1. 编辑配置文件: 该文件位于我们在 docker-compose.yml 中映射的目录里。

    Bash

    1
    vim /data/office-server/nextcloud_data/config/config.php
  2. 添加代理代码: 在文件的最后部分,但在 ); (最后一行)之前,插入下面这行配置。 (请把 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'],
    );
  3. 保存退出: (Esc -> :wq)。

  4. 无需重启: Nextcloud 的 PHP 配置文件是即时生效的,不需要重启 Docker。


第三步:安装并连接 OnlyOffice

配置好代理后,我们就可以正式把这两个强大的软件连起来了。

  1. 进入 Nextcloud 应用商店:
    • 在网页右上角点击你的头像 -> **应用 (Apps)**。
    • 此时因为配了代理,页面应该加载得很快(左侧会出现应用分类)。
  2. 搜索插件:
    • 点击右上角的放大镜图标,搜索 ONLYOFFICE
    • 找到 “ONLYOFFICE” (官方连接器),点击 **”下载并启用” (Download and enable)**。
  3. 配置连接:
    • 安装完成后,点击右上角头像 -> **管理设置 (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插件设置如下:

![image-20260110203341883](F:\Program Files\PortableGit\blog\source\pic\image-20260110203341883.png)

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;
}
}
}

作者

fei

发布于

2026-01-10

更新于

2026-01-11

许可协议

评论