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 服务器。
扩展阅读