提交 313f1a32 authored 作者: 陈泽健's avatar 陈泽健

feat(onlyoffice): 添加 OnlyOffice 自动化部署脚本及相关文档

- 实现 OnlyOffice Document Server 自动化部署脚本
- 添加 CPU 架构检查、内核参数配置、Docker 服务检查等功能
- 实现镜像加载、端口冲突检查、数据目录准备等部署流程
- 添加容器启动和实时日志监控功能
- 创建详细的 PRD 需求文档和计划执行文档
- 提供完整的配置参数说明和故障处理指南
- 实现彩色日志输出和错误处理机制
上级 1dd466fc
# _PRD_Onlyoffice_自动化部署需求文档
> 版本:V1.0
> 更新日期:2026-02-26
> 适用范围:OnlyOffice 自动化部署脚本
> 来源:OnlyOffice Document Server 自动化安装脚本
> 部署脚本:`自动化部署脚本/x86架构/onlyoffice/auto_install_onlyoffice.sh`
> 支持架构:x86_64 (amd64)
## 1. 背景与目标
### 1.1 背景
OnlyOffice Document Server 是一个开源的在线文档协作服务,部署过程涉及多个配置步骤和环境检查,手动部署容易出错且效率低下。需要开发一套自动化部署脚本,实现一键部署。
### 1.2 目标
提供 OnlyOffice Document Server 的自动化部署能力,实现环境检查、镜像加载、容器启动、日志监控等全流程自动化,确保部署过程标准化、可重复、易维护。
### 1.3 约束条件
- **架构限制**:当前仅支持 x86_64 (amd64) 架构
- **依赖服务**:需要 Docker 环境支持
- **镜像文件**:需要预准备 OnlyOffice 镜像 tar.gz 文件
---
## 2. 功能需求
### 2.1 核心功能模块
| 序号 | 功能模块 | 描述 | 优先级 |
|-----|---------|------|-------|
| 1 | CPU 架构检查 | 验证服务器架构为 x86_64,不支持 ARM 架构 | P0 |
| 2 | 内核参数配置 | 配置 vm.max_map_count 和内核参数 | P0 |
| 3 | Swap 空间检查 | 检查 Swap 状态,未配置时给出警告提示 | P1 |
| 4 | Docker 服务检查 | 验证 Docker 服务运行状态 | P0 |
| 5 | 镜像加载 | 从本地文件加载 Docker 镜像 | P0 |
| 6 | 端口冲突检查 | 检查默认端口 18080 是否被占用 | P0 |
| 7 | 数据目录准备 | 创建容器所需的数据挂载目录 | P0 |
| 8 | 容器启动 | 启动 OnlyOffice 容器并配置相关参数 | P0 |
| 9 | 日志实时监控 | 启动后进入实时日志查看模式 | P1 |
---
### 2.2 详细功能说明
#### 2.2.1 CPU 架构检查
**目标**:确保服务器 CPU 架构与 OnlyOffice 镜像兼容。
| 检测项 | 说明 |
|--------|------|
| 支持架构 | x86_64 / amd64 |
| 不支持架构 | ARM (鲲鹏、飞腾、树莓派等) |
| 失败处理 | 脚本退出,提示用户寻找 ARM 版镜像或重新构建 |
**错误提示信息**
```
当前服务器架构为 [ARM],不支持运行此 OnlyOffice 镜像!
当前 OnlyOffice 镜像仅支持 x86_64 (amd64) 架构。
如需在 ARM 架构 (如鲲鹏、飞腾、树莓派) 上运行,请寻找专门的 ARM 版镜像或重新构建。
```
#### 2.2.2 内核参数配置
**目标**:配置 OnlyOffice 运行所需的内核参数。
| 参数 | 值 | 说明 |
|------|-----|------|
| vm.max_map_count | 262144 | Elasticsearch 所需参数 |
| kernel.unprivileged_userns_clone | 1 | 非特权用户命名空间克隆 |
**处理方式**
- 静默执行,不输出配置结果
- 参数设置失败不影响后续流程(kernel.unprivileged_userns_clone 使用 `|| true` 容错)
#### 2.2.3 Swap 空间检查
**目标**:检查系统 Swap 配置,防止内存不足导致服务崩溃。
| 检测项 | 说明 |
|--------|------|
| 检测命令 | `free -m` |
| 判断标准 | Swap Total = 0MB 时警告 |
| 处理方式 | 仅警告提示,不中断部署 |
**输出示例**
```
[WARN] 未检测到 Swap!建议手动配置以防内存不足。
```
#### 2.2.4 Docker 服务检查
**目标**:确保 Docker 服务正常运行。
| 检测项 | 说明 |
|--------|------|
| 检测命令 | `docker info` |
| 失败处理 | 脚本退出,提示用户启动 Docker |
**错误提示信息**
```
[ERROR] Docker 未运行,请启动 Docker 后重试。
```
#### 2.2.5 镜像加载
**目标**:从本地文件加载 OnlyOffice Docker 镜像。
| 配置项 | 默认值 |
|--------|--------|
| 镜像文件路径 | `./onlyoffice-documentserver-9.2.1.tar.gz` |
| 镜像标签 | `onlyoffice/documentserver:9.2.1` |
| 支持格式 | 处理方式 |
|---------|---------|
| .tar.gz | `gunzip -c` 解压后 `docker load` |
| .tar | 直接 `docker load -i` |
**失败处理**
- 文件不存在:脚本退出
- 加载失败:脚本退出
#### 2.2.6 端口冲突检查
**目标**:确保配置的端口未被其他服务占用。
| 配置项 | 默认值 |
|--------|--------|
| 监听端口 | 18080 |
| 容器内部端口 | 80 |
| 检测工具 | 优先级 |
|---------|--------|
| ss | 高 |
| netstat | 低 |
**失败处理**
- 端口被占用:脚本退出,提示修改 PORT 变量或关闭占用程序
#### 2.2.7 数据目录准备
**目标**:创建容器数据持久化所需的目录结构。
| 挂载目录 | 容器内路径 | 用途 |
|---------|-----------|------|
| /app/onlyoffice/logs | /var/log/onlyoffice | OnlyOffice 日志 |
| /app/onlyoffice/log4j | /var/log/onlyoffice/documentserver/log4js | Log4JS 日志 |
| /app/onlyoffice/mysql | /var/lib/mysql | MySQL 数据 |
| /app/onlyoffice/rabbitmq | /var/lib/rabbitmq | RabbitMQ 数据 |
| /app/onlyoffice/redis | /var/lib/redis | Redis 数据 |
| /app/onlyoffice/documentserver-data | /var/www/onlyoffice/Data | 文档服务器数据 |
#### 2.2.8 容器启动
**目标**:启动 OnlyOffice Document Server 容器。
| 配置项 | 值 | 说明 |
|--------|-----|------|
| 容器名称 | onlyoffice-document-server | 容器标识 |
| 重启策略 | --restart=always | 自动重启 |
| 端口映射 | 18080:80 | 宿主机:容器 |
| 共享内存 | 1g | --shm-size |
| 内存限制 | 4g | --memory |
| 文件描述符限制 | 65536:65536 | --ulimit nofile |
| 安全选项 | seccomp=unconfined | --security-opt |
| JWT 配置 | 值 |
|---------|-----|
| JWT_ENABLED | false |
| JWT_SECRET | dNrprU&2S |
| JWT_HEADER | Authorization |
**失败处理**
- 容器启动失败:脚本退出
#### 2.2.9 日志实时监控
**目标**:部署完成后进入实时日志查看模式,便于确认服务启动状态。
| 功能 | 说明 |
|------|------|
| 命令 | `docker logs -f $CONTAINER_NAME` |
| 退出方式 | Ctrl+C |
---
## 3. 日志输出规范
### 3.1 日志级别
| 级别 | 颜色 | 函数 | 使用场景 |
|------|------|------|---------|
| INFO | 蓝色 | log_info() | 正常流程信息 |
| SUCCESS | 绿色 | log_success() | 操作成功提示 |
| WARN | 黄色 | log_warn() | 警告信息(不中断流程) |
| ERROR | 红色 | log_error() | 错误信息(中断流程) |
### 3.2 日志格式
```
[级别] 消息内容
```
**示例**
```
[INFO] 检查服务器 CPU 架构...
[SUCCESS] 当前架构为 x86_64,符合要求。
[WARN] 未检测到 Swap!建议手动配置以防内存不足。
[ERROR] 镜像文件不存在:./onlyoffice-documentserver-9.2.1.tar.gz
```
---
## 4. 配置参数
### 4.1 可配置变量
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| PORT | 18080 | 服务监听端口 |
| IMAGE_FILE | ./onlyoffice-documentserver-9.2.1.tar.gz | 镜像文件路径 |
| CONTAINER_NAME | onlyoffice-document-server | 容器名称 |
| JWT_SECRET | dNrprU&2S | JWT 密钥 |
---
## 5. 执行流程
```
开始
1. CPU 架构检查 ────────→ [架构不符] → 结束(报错)
↓ [x86_64]
2. 内核参数配置
3. Swap 空间检查(警告提示)
4. Docker 服务检查 ───────→ [Docker未运行] → 结束(报错)
↓ [Docker运行中]
5. 镜像文件检查 ──────────→ [文件不存在] → 结束(报错)
↓ [文件存在]
6. 加载镜像 ──────────────→ [加载失败] → 结束(报错)
↓ [镜像加载成功]
7. 端口冲突检查 ──────────→ [端口被占用] → 结束(报错)
↓ [端口可用]
8. 创建数据目录
9. 启动容器 ──────────────→ [启动失败] → 结束(报错)
↓ [容器启动成功]
10. 实时日志监控
结束(Ctrl+C 退出日志监控)
```
---
## 6. 依赖清单
### 6.1 系统依赖
| 依赖 | 版本要求 | 说明 |
|------|---------|------|
| Bash | 任意 | 脚本解释器 |
| Docker | 任意 | 容器运行时 |
| ss/netstat | 任意 | 端口检测工具(至少一个) |
### 6.2 文件依赖
| 文件 | 说明 |
|------|------|
| onlyoffice-documentserver-9.2.1.tar.gz | OnlyOffice 镜像文件 |
---
## 7. 故障处理
### 7.1 常见问题
| 问题 | 原因 | 解决方案 |
|------|------|---------|
| 脚本提示架构不兼容 | 服务器为 ARM 架构 | 寻找 ARM 版镜像或使用 x86 服务器 |
| Docker 未运行 | Docker 服务未启动 | 执行 `systemctl start docker` |
| 端口被占用 | 18080 端口已有服务 | 修改 PORT 变量或停止占用服务 |
| 镜像加载失败 | 镜像文件损坏或路径错误 | 检查文件路径和完整性 |
| 容器启动失败 | 参数配置错误 | 查看 Docker 错误日志 |
---
## 8. 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
*文档结束*
#!/bin/bash
# --- 颜色定义 ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# --- 配置 ---
PORT=18080
IMAGE_FILE="./onlyoffice-documentserver-9.2.1.tar.gz"
CONTAINER_NAME="onlyoffice-document-server"
JWT_SECRET="dNrprU&2S"
# --- 辅助函数 ---
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# ==========================================
# 【新增】0. 检查 CPU 架构
# ==========================================
log_info "检查服务器 CPU 架构..."
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "amd64" ]; then
log_success "当前架构为 x86_64,符合要求。"
else
log_error "当前服务器架构为 [$ARCH],不支持运行此 OnlyOffice 镜像!"
log_error "当前OnlyOffice 镜像仅支持 x86_64 (amd64) 架构。"
log_error "如需在 ARM 架构 (如鲲鹏、飞腾、树莓派) 上运行,请寻找专门的 ARM 版镜像或重新构建。"
exit 1
fi
log_info "开始部署 OnlyOffice..."
# 1. 设置内核参数
log_info "正在配置内核参数..."
sysctl -w vm.max_map_count=262144 >/dev/null 2>&1
sysctl -w kernel.unprivileged_userns_clone=1 >/dev/null 2>&1 || true
# 2. 检查 Swap (仅提示)
log_info "检查 Swap 空间..."
free -h
SWAP_TOTAL=$(free -m | awk '/^Swap:/{print $2}')
if [ "$SWAP_TOTAL" -eq 0 ]; then
log_warn "未检测到 Swap!建议手动配置以防内存不足。"
else
log_success "Swap 空间正常 (${SWAP_TOTAL}MB)"
fi
# 3. 检查 Docker
log_info "检查 Docker 服务..."
if ! docker info >/dev/null 2>&1; then
log_error "Docker 未运行,请启动 Docker 后重试。"
exit 1
fi
# 4. 加载镜像
log_info "正在加载镜像文件:$IMAGE_FILE"
if [ ! -f "$IMAGE_FILE" ]; then
log_error "镜像文件不存在:$IMAGE_FILE"
exit 1
fi
if [[ "$IMAGE_FILE" == *.gz ]]; then
gunzip -c "$IMAGE_FILE" | docker load
else
docker load -i "$IMAGE_FILE"
fi
if [ $? -ne 0 ]; then
log_error "镜像加载失败!"
exit 1
fi
log_success "镜像加载成功"
# 5. 检查端口冲突
log_info "检查端口 $PORT 是否被占用..."
if command -v ss >/dev/null 2>&1; then
CHECK_CMD="ss -tulpn"
elif command -v netstat >/dev/null 2>&1; then
CHECK_CMD="netstat -tulpn"
else
CHECK_CMD=""
fi
if [ -n "$CHECK_CMD" ] && $CHECK_CMD 2>/dev/null | grep -q ":$PORT "; then
log_error "端口 $PORT 已被占用!请修改 PORT 变量或关闭占用程序。"
exit 1
else
log_success "端口 $PORT 可用"
fi
# 6. 准备数据目录
log_info "创建数据目录..."
mkdir -p /app/onlyoffice/{logs,log4j,mysql,rabbitmq,redis,documentserver-data}
# 7. 启动容器
log_info "正在启动容器..."
docker run -d --restart=always \
--name $CONTAINER_NAME \
-p $PORT:80 \
-v /app/onlyoffice/logs:/var/log/onlyoffice \
-v /app/onlyoffice/log4j:/var/log/onlyoffice/documentserver/log4js \
-v /app/onlyoffice/mysql:/var/lib/mysql \
-v /app/onlyoffice/rabbitmq:/var/lib/rabbitmq \
-v /app/onlyoffice/redis:/var/lib/redis \
-v /app/onlyoffice/documentserver-data:/var/www/onlyoffice/Data \
-e JWT_ENABLED=false \
-e JWT_SECRET=$JWT_SECRET \
-e JWT_HEADER=Authorization \
--shm-size="1g" \
--memory="4g" \
--ulimit nofile=65536:65536 \
--security-opt seccomp=unconfined \
onlyoffice/documentserver:9.2.1
if [ $? -ne 0 ]; then
log_error "容器启动失败!"
exit 1
fi
log_success "✅ 容器已启动,正在进入实时日志监控 (按 Ctrl+C 退出日志)..."
echo ""
# 8. 【核心修改】直接实时打印日志
docker logs -f $CONTAINER_NAME
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论