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

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.propertiestrue首次配置
OP 管理ops.json清空,用权限组首次配置
白名单server.properties按需开启首次配置
防火墙UFW/firewalld仅开放必要端口首次配置
SSH 密钥/root/.ssh/禁用密码登录首次配置
RCON 安全server.properties限制 IP首次配置
插件安全plugins/仅官方来源每次安装
反 Xraypaper-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-102 核4 GB10 Mbps50 GB¥50-100
10-304 核8 GB30 Mbps100 GB¥150-300
30-504 核12 GB50 Mbps200 GB¥300-500
50-1008 核16 GB100 Mbps500 GB¥500-1000
100-2008 核24 GB200 Mbps1 TB¥1000-2000
200+多服分布式专线NAS¥2000+

15.5.2 扩容指标

指标阈值操作
CPU 持续 > 70%1 小时增加 CPU 核心
内存 > 85%持续增加内存
磁盘 > 80%趋势扩容/清理
TPS < 1830 分钟优化或分服
玩家接近上限趋势增加 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聊天过滤
DiscordSRVDiscord 集成

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 服务器。


扩展阅读