强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Minecraft PaperMC 服务器部署指南 / 15 - 生产运维规范

15 - 生产运维规范

15.1 运维体系概述

15.1.1 运维成熟度模型

级别 特征 适用场景
L0 - 手动 所有操作手动执行 开发测试
L1 - 脚本化 关键操作有脚本 小型私人服
L2 - 自动化 定时任务 + 自动备份 中型社区服
L3 - 监控化 监控告警 + 自动响应 大型公共服
L4 - 平台化 完整运维平台 商业运营

15.1.2 运维核心原则

1. 最小权限原则
   - 不使用 OP,通过 LuckPerms 权限组管理
   - 服务器进程使用非 root 用户
   - 防火墙只开放必要端口

2. 可回滚原则
   - 每次变更前创建备份
   - 使用版本控制管理配置
   - 保留足够历史版本

3. 自动化原则
   - 重复操作脚本化
   - 定时任务自动执行
   - 异常自动告警

4. 文档化原则
   - 记录所有变更
   - 维护 SOP 文档
   - 故障处理归档

15.2 安全管理

15.2.1 服务器安全检查清单

检查项 配置位置 推荐值 频率
在线模式 server.properties true 首次配置
OP 管理 ops.json 清空,用权限组 首次配置
白名单 server.properties 按需开启 首次配置
防火墙 UFW/firewalld 仅开放必要端口 首次配置
SSH 密钥 /root/.ssh/ 禁用密码登录 首次配置
RCON 安全 server.properties 限制 IP 首次配置
插件安全 plugins/ 仅官方来源 每次安装
反 Xray paper-world-defaults.yml 启用 首次配置
反作弊 Vulcan/GrimAC 启用 首次配置
备份验证 备份脚本 每月测试 每月

15.2.2 SSH 安全加固

# /etc/ssh/sshd_config

# 禁用 root 登录
PermitRootLogin no

# 禁用密码登录
PasswordAuthentication no

# 仅允许密钥登录
PubkeyAuthentication yes

# 限制登录用户
AllowUsers minecraft

# 修改默认端口
Port 2222

# 设置登录超时
ClientAliveInterval 300
ClientAliveCountMax 2

# 重启 SSH
sudo systemctl restart sshd

15.2.3 系统用户安全

# 创建专用用户
sudo useradd -r -m -d /opt/minecraft -s /bin/bash minecraft

# 设置强密码
sudo passwd minecraft

# 限制 sudo 权限
sudo visudo
# minecraft ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart minecraft
# minecraft ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop minecraft

# 设置文件权限
sudo chown -R minecraft:minecraft /opt/minecraft
sudo chmod 750 /opt/minecraft

15.2.4 定期安全审计

#!/bin/bash
# security-audit.sh - 安全审计脚本

echo "=== 安全审计报告 ==="
echo "日期: $(date)"
echo ""

# 1. 检查 OP 列表
echo "--- OP 列表 ---"
cat /opt/minecraft/paper/ops.json | python3 -m json.tool

# 2. 检查白名单
echo "--- 白名单 ---"
cat /opt/minecraft/paper/whitelist.json | python3 -m json.tool

# 3. 检查封禁列表
echo "--- 封禁玩家 ---"
cat /opt/minecraft/paper/banned-players.json | python3 -m json.tool

# 4. 检查插件列表
echo "--- 已安装插件 ---"
ls /opt/minecraft/paper/plugins/*.jar | xargs -I{} basename {}

# 5. 检查文件权限
echo "--- 关键文件权限 ---"
ls -la /opt/minecraft/paper/server.properties
ls -la /opt/minecraft/paper/eula.txt

# 6. 检查开放端口
echo "--- 开放端口 ---"
sudo ss -tlnp

# 7. 检查防火墙规则
echo "--- 防火墙规则 ---"
sudo ufw status verbose

15.3 自动更新

15.3.1 PaperMC 自动更新脚本

#!/bin/bash
# update-paper.sh - PaperMC 自动更新脚本

SERVER_DIR="/opt/minecraft/paper"
BACKUP_DIR="/opt/minecraft/backups/pre-update"
MINECRAFT_VERSION="1.21.4"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

echo "=== PaperMC 自动更新 ==="
echo "目标版本: ${MINECRAFT_VERSION}"

# 1. 获取最新构建号
LATEST_BUILD=$(curl -s "https://api.papermc.io/v2/projects/paper/versions/${MINECRAFT_VERSION}/builds" \
  | python3 -c "import json,sys; print(json.load(sys.stdin)['builds'][-1]['build'])")

# 获取当前版本
CURRENT_BUILD=$(java -jar ${SERVER_DIR}/paper.jar --version 2>/dev/null | grep -oP '\d+$')

echo "当前版本: ${CURRENT_BUILD}"
echo "最新版本: ${LATEST_BUILD}"

if [ "$CURRENT_BUILD" = "$LATEST_BUILD" ]; then
    echo "已是最新版本,无需更新"
    exit 0
fi

# 2. 创建更新前备份
echo "创建更新前备份..."
mkdir -p "$BACKUP_DIR"
cp "${SERVER_DIR}/paper.jar" "${BACKUP_DIR}/paper_${TIMESTAMP}.jar"

# 3. 停止服务器
echo "停止服务器..."
sudo systemctl stop minecraft
sleep 5

# 4. 下载新版本
echo "下载 PaperMC ${MINECRAFT_VERSION} build ${LATEST_BUILD}..."
JAR_NAME="paper-${MINECRAFT_VERSION}-${LATEST_BUILD}.jar"
curl -o "${SERVER_DIR}/paper.jar" \
  "https://api.papermc.io/v2/projects/paper/versions/${MINECRAFT_VERSION}/builds/${LATEST_BUILD}/downloads/${JAR_NAME}"

# 5. 启动服务器
echo "启动服务器..."
sudo systemctl start minecraft

# 6. 检查启动是否成功
sleep 30
if sudo systemctl is-active minecraft; then
    echo "✅ 更新成功!"
    echo "新版本: PaperMC ${MINECRAFT_VERSION} build ${LATEST_BUILD}"
else
    echo "❌ 更新失败,回滚到旧版本..."
    cp "${BACKUP_DIR}/paper_${TIMESTAMP}.jar" "${SERVER_DIR}/paper.jar"
    sudo systemctl start minecraft
    echo "已回滚到版本 ${CURRENT_BUILD}"
fi

15.3.2 插件自动更新

#!/bin/bash
# update-plugins.sh - 插件更新检查脚本

PLUGIN_DIR="/opt/minecraft/paper/plugins"
LOG_FILE="/var/log/mc-plugin-update.log"

echo "=== 插件更新检查 ===" | tee -a "$LOG_FILE"

# 检查 SpigotMC 资源更新(需要资源 ID)
check_spigot_update() {
    local resource_id="$1"
    local current_version="$2"

    # 使用 Spiget API 检查更新
    local latest=$(curl -s "https://api.spiget.org/v2/resources/${resource_id}/versions/latest" \
        | python3 -c "import json,sys; print(json.load(sys.stdin).get('name', 'unknown'))" 2>/dev/null)

    if [ "$latest" != "$current_version" ] && [ "$latest" != "unknown" ]; then
        echo "  ⚠️ 发现更新: ${current_version}${latest}" | tee -a "$LOG_FILE"
        return 0
    else
        echo "  ✅ 已是最新: ${current_version}" | tee -a "$LOG_FILE"
        return 1
    fi
}

# 遍历插件目录
for jar in ${PLUGIN_DIR}/*.jar; do
    if [ -f "$jar" ]; then
        NAME=$(unzip -p "$jar" plugin.yml 2>/dev/null | grep "^name:" | cut -d: -f2 | tr -d ' ')
        VERSION=$(unzip -p "$jar" plugin.yml 2>/dev/null | grep "^version:" | cut -d: -f2 | tr -d ' ')
        echo "检查: ${NAME} (${VERSION})" | tee -a "$LOG_FILE"
    fi
done

15.3.3 更新策略

更新类型 策略 测试 回滚
PaperMC 小版本 自动更新 无需 自动回滚
PaperMC 大版本 手动更新 测试服验证 手动回滚
核心插件 手动更新 测试服验证 手动回滚
辅助插件 自动更新 无需 手动回滚
Java 版本 手动更新 测试服验证 手动切换

15.4 运维 SOP

15.4.1 日常运维 SOP

每日检查(5 分钟):

#!/bin/bash
# daily-check.sh - 每日检查脚本

echo "=== 每日服务器检查 ==="
echo "日期: $(date)"

# 1. 服务器状态
echo "--- 服务器状态 ---"
if systemctl is-active minecraft; then
    echo "✅ 服务运行中"
else
    echo "❌ 服务已停止!"
fi

# 2. TPS 和内存
echo "--- 性能指标 ---"
docker exec mc-paper rcon-cli "spark tps" 2>/dev/null || echo "RCON 不可用"

# 3. 磁盘空间
echo "--- 磁盘空间 ---"
df -h /opt/minecraft

# 4. 备份状态
echo "--- 最新备份 ---"
ls -lt /opt/minecraft/backups/*.tar.gz | head -3

# 5. 日志错误
echo "--- 最近错误 ---"
grep -c "ERROR" /opt/minecraft/paper/logs/latest.log

每周检查(15 分钟):

#!/bin/bash
# weekly-check.sh - 每周检查脚本

echo "=== 每周服务器检查 ==="

# 1. 安全审计
/opt/minecraft/scripts/security-audit.sh

# 2. 性能分析
# 启动 Spark Profiler 5 分钟
# /spark profiler --timeout 300

# 3. 备份验证
# 验证最新备份的完整性
LATEST_BACKUP=$(ls -t /opt/minecraft/backups/*.tar.gz | head -1)
/opt/minecraft/scripts/verify-backup.sh "$LATEST_BACKUP"

# 4. 更新检查
/opt/minecraft/scripts/update-paper.sh --check-only

# 5. 清理旧日志
find /opt/minecraft/paper/logs -name "*.log.gz" -mtime +30 -delete
find /opt/minecraft/paper/crash-reports -mtime +30 -delete

15.4.2 变更管理 SOP

变更申请 → 评审 → 测试 → 备份 → 实施 → 验证 → 记录

变更记录模板:

## 变更记录

| 日期 | 变更内容 | 操作人 | 影响范围 | 回滚方案 | 状态 |
|------|----------|--------|----------|----------|------|
| 2026-05-10 | 升级 PaperMC 1.21.3→1.21.4 | Admin | 全部 | 使用备份 JAR | ✅ |
| 2026-05-08 | 安装 Vulcan 反作弊 | Admin | 全部 | 删除插件 JAR | ✅ |
| 2026-05-05 | 修改视距 10→8 | Admin | 全部 | 恢复配置 | ✅ |

15.4.3 故障响应 SOP

故障报告 → 初步诊断 → 判断严重性 → 执行响应 → 确认恢复 → 事后复盘

严重性分级:

级别 定义 响应时间 示例
P0 - 紧急 服务器完全不可用 15 分钟 崩溃、无法连接
P1 - 严重 核心功能受损 1 小时 TPS < 10、数据损坏
P2 - 一般 部分功能异常 4 小时 插件错误、小范围卡顿
P3 - 轻微 不影响游戏体验 次日 日志警告、UI 问题

15.4.4 故障处理记录模板

## 故障处理记录

- **故障时间**:2026-05-10 14:30 - 15:00
- **严重级别**:P1
- **影响范围**:所有玩家
- **故障现象**:TPS 降至 8,玩家普遍反映卡顿
- **根本原因**:生存服大量僵尸堆积(~3000 只)
- **处理过程**:
  1. 14:35 收到玩家反馈
  2. 14:38 Spark Profiler 启动分析
  3. 14:42 定位到实体问题
  4. 14:45 执行 `/kill @e[type=zombie,distance=100..]`
  5. 14:47 TPS 恢复正常
- **预防措施**:
  - 调整 spigot.yml 中 `spawn-limits.monsters` 从 70 降至 50
  - 配置 ClearLagg 定时清理实体
- **后续跟进**:持续监控一周

15.5 容量规划

15.5.1 资源估算表

在线人数 CPU 内存 带宽 存储 月成本估算
1-10 2 核 4 GB 10 Mbps 50 GB ¥50-100
10-30 4 核 8 GB 30 Mbps 100 GB ¥150-300
30-50 4 核 12 GB 50 Mbps 200 GB ¥300-500
50-100 8 核 16 GB 100 Mbps 500 GB ¥500-1000
100-200 8 核 24 GB 200 Mbps 1 TB ¥1000-2000
200+ 多服 分布式 专线 NAS ¥2000+

15.5.2 扩容指标

指标 阈值 操作
CPU 持续 > 70% 1 小时 增加 CPU 核心
内存 > 85% 持续 增加内存
磁盘 > 80% 趋势 扩容/清理
TPS < 18 30 分钟 优化或分服
玩家接近上限 趋势 增加 max-players

15.6 灾难恢复计划

15.6.1 灾难恢复清单

## 灾难恢复清单

### 1. 服务器崩溃/硬件故障
- [ ] 确认备份位置和最新时间
- [ ] 准备替代服务器(云/本地)
- [ ] 恢复备份到新服务器
- [ ] 验证数据完整性
- [ ] 更新 DNS/端口转发
- [ ] 通知玩家新连接信息

### 2. 数据损坏
- [ ] 停止服务器防止进一步损坏
- [ ] 评估损坏范围
- [ ] 从备份恢复
- [ ] 使用 CoreProtect 回滚部分操作
- [ ] 验证恢复结果

### 3. 安全事件
- [ ] 隔离受影响的服务器
- [ ] 封禁攻击者
- [ ] 审计损失
- [ ] 从备份恢复
- [ ] 加固安全配置

### 4. 勒索软件攻击
- [ ] 断开网络连接
- [ ] 不支付赎金
- [ ] 从离线备份恢复
- [ ] 清除感染
- [ ] 加固安全配置

15.6.2 RTO 和 RPO

指标 含义 目标
RTO 恢复时间目标 < 30 分钟
RPO 恢复点目标 < 6 小时(最大数据丢失)

15.7 文档体系

15.7.1 必要文档

文档 说明 更新频率
架构图 服务器拓扑、网络结构 架构变更时
配置清单 所有服务器的配置参数 配置变更时
SOP 文档 标准操作流程 流程变更时
故障处理手册 常见问题解决方案 每次故障后
变更记录 所有变更历史 每次变更
联系人列表 运维人员联系方式 变动时
备份清单 备份类型/频率/位置 策略变更时

15.7.2 运维知识库结构

docs/
├── architecture.md          # 架构说明
├── sop/
│   ├── daily-check.md       # 每日检查
│   ├── weekly-check.md      # 每周检查
│   ├── backup.md            # 备份操作
│   ├── update.md            # 更新操作
│   └── incident-response.md # 故障响应
├── config/
│   ├── server.properties.md # 配置说明
│   ├── paper-config.md
│   └── plugins.md
├── troubleshooting/
│   ├── common-issues.md     # 常见问题
│   ├── performance.md       # 性能问题
│   └── network.md           # 网络问题
└── changelog.md             # 变更日志

15.8 玩家管理

15.8.1 玩家规则

# 服务器规则

## 基本规则
1. 尊重其他玩家
2. 禁止作弊/利用漏洞
3. 禁止恶意破坏
4. 禁止不当言论
5. 遵循管理员指示

## 处罚流程
1. 第一次违规:警告
2. 第二次违规:禁言 1 小时
3. 第三次违规:封禁 1 天
4. 第四次违规:永久封禁
5. 严重违规:直接永久封禁

## 申诉渠道
- QQ 群:123456
- 邮箱:[email protected]

15.8.2 社区管理工具

工具 说明
LuckPerms 权限管理
CoreProtect 方块日志回滚
AdvancedBan 封禁管理
LiteBans 高级封禁系统
ChatControl 聊天过滤
DiscordSRV Discord 集成

15.9 成本优化

15.9.1 硬件成本优化

优化方向 方法 节省
云服务器 选择竞价实例 50-90%
存储 使用 HDD 存储备份 50%
带宽 压缩传输数据 30%
计费 包年包月 30-50%

15.9.2 运维效率优化

优化方向 方法 效果
自动化 脚本化重复操作 节省 80% 时间
监控 自动告警 减少 90% 人工巡检
模板化 SOP 标准化 降低培训成本
文档化 知识库建设 减少重复排查

15.10 总结

15.10.1 全书要点回顾

章节 核心要点
01 - 简介 PaperMC 是最优插件服务端选择
02 - 安装 Java 21 + Aikar’s Flags + systemd
03 - 配置 三层配置体系,按需调整
04 - 世界 Multiverse 管理,定期备份
05 - 权限 LuckPerms 是标配,权限组替代 OP
06 - 插件 可信来源,二分法排查冲突
07 - 性能 Aikar’s Flags + 视距优化 + 实体管理
08 - 安全 反 Xray + 反作弊 + 区域保护
09 - 备份 3-2-1 原则,自动备份,定期验证
10 - 网络 防火墙 + 端口转发 + DDoS 防护
11 - Docker 容器化部署,Docker Compose 管理
12 - 代理 Velocity 代理,Modern Forwarding
13 - 监控 Spark + Prometheus + Grafana
14 - 排查 日志分析 + Spark Profiler + 二分法
15 - 运维 安全管理 + SOP + 自动化

15.10.2 一句话建议

PaperMC + LuckPerms + EssentialsX + CoreProtect + Spark + 自动备份 = 一个可靠的 Minecraft 服务器。


扩展阅读