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
- 邮箱:admin@example.com
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 服务器。
扩展阅读