服务端运维


本文以 Ubuntu 为示例,按“部署初始化、网络、地图与资源、服务托管、常见问题”排列。命令中的用户名、路径和端口需要按实际环境调整。

1. 部署依赖安装🔗

sudo apt update
sudo apt install -y screen nginx git default-jdk wget curl mysql unzip tree

default-jdk 提供系统默认 JDK;生产服务器建议按 Paper 版本安装指定大版本,而不是长期依赖系统默认版本。

2. 网络与访问🔗

Query 协议需要 UDP🔗

使用 Query 协议查询服务器状态需要 UDP 协议,因此在云服务器上部署时需要放行对应端口。

Mac 上无线网络总是断开重连🔗

这可能是网络问题,可以在 Minecraft Bug 列表中搜索该问题: MC-98598 。解决方案是在 JVM 启动参数中指定使用 IPv4:

-Djava.net.preferIPv4Stack=true

粗略估算服务器可容纳的玩家数🔗

安装网速测试工具并测速:

$ pip install speedtest-cli
$ speedtest-cli

将上下行网速和服务器内存大小填入 canihostaminecraftserver.com 进行粗略估算。该结果只能作为容量参考,实际还要考虑插件、实体数量和区块加载。

3. 地图与资源🔗

将低版本地图更新到新版本🔗

只需要在启动命令中添加 --forceUpgrade,启动一次完成地图更新后,后续启动不需要再加这个选项。

Paper 26.1+(与 Vanilla 一致)的地图文件为单目录嵌套维度结构:

  • 主世界:world/dimensions/minecraft/overworld/
  • 下界:world/dimensions/minecraft/the_nether/
  • 末地:world/dimensions/minecraft/the_end/

从纯净服迁移时,将对应存档文件夹复制到 world/ 目录下,重启服务即可完成地图迁移。

为服务器添加自定义图标🔗

在服务端 JAR 文件同一级目录放置 server-icon.png,尺寸为 64x64,然后重新启动服务端。客户端连接时会在服务器列表展示该图标。

资源包制作注意事项🔗

资源包 ZIP 的根目录必须同时包含 pack.mcmetaassets/。正确做法是在资源包根目录内压缩,而不是进入 assets/ 目录:

cd /path/to/resource-pack-root
zip -r resourcepack.zip ./*

查看资源包 SHA-1:

echo -e "SHA-1: " "$(shasum -b resourcepack.zip | cut -d ' ' -f 1)"

添加自定义音乐播放🔗

将 MP3 转成 OGG(保持第一个音频通道):

ffmpeg -i origin.mp3 -map 0:a:0 output.ogg

资源包目录结构示例:

├── assets
│   └── minecraft
│       ├── sounds
│       │   └── music
│       │       └── joker
│       │           └── joker.ogg
│       ├── sounds.json
│       └── textures
│           └── entity
│               ├── alex.png
│               └── steve.png
├── pack.mcmeta
└── pack.png

assets/minecraft/ 下创建 sounds.json,定义声音文件和游戏声音事件的对应关系:

{
    "music.joker": {
        "sounds": [
          {
            "name": "music/joker/joker",
            "stream": true,
            "volume": 1
          }
        ]
      }
}

游戏内可以使用 /playsound music.joker @a 播放,配合命令方块可实现更多玩法。

4. 服务托管与自动化🔗

使用 systemd 托管服务端🔗

将以下内容保存为 /etc/systemd/system/minecraft.service,按 JAR 文件名、内存和目录调整:

[Unit]
Description=Minecraft Paper Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/java -Xms2G -Xmx4G -jar paper.jar --nogui
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

部署并启动:

sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
sudo systemctl status minecraft

需要进入服务端控制台时,可以配合 screen/tmux 托管,或使用单独的管理工具;systemd 直接接管进程时,控制台输入和插件交互会受限。

使用 crontab 添加定时提醒🔗

保存提醒脚本,例如 /home/minecraft/mc_cron.sh

#!/usr/bin/env bash

TITLE="jokermc"

function notify() {
    /usr/bin/screen -p 0 -S "$TITLE" -X eval 'stuff "title @a times 10 100 10"\\015'
    /usr/bin/screen -p 0 -S "$TITLE" -X eval 'stuff "title @a title {\\"text\\":\\"温馨提示\\",\\"color\\":\\"white\\",\\"bold\\":\\"true\\"}"\\015'
    /usr/bin/screen -p 0 -S "$TITLE" -X eval 'stuff "title @a subtitle {\\"text\\":\\"各位冒险家们注意早点休息啦!\\",\\"color\\":\\"yellow\\",\\"bold\\":\\"true\\"}"\\015'
}

notify

添加定时任务:

crontab -e
# m h  dom mon dow   command
0 2 * * *  /home/minecraft/mc_cron.sh

这里的 TITLE 必须与运行服务端的 screen 会话名一致,路径也需要按自己的部署环境调整。

5. 常见问题🔗

  • 端口不通:先确认服务端进程已监听,再检查云安全组和系统防火墙;Query 协议走 UDP,普通联机走 TCP。
  • 插件更新后状态异常:不要用 /reload,直接重启服务端。
  • 资源包无法加载:检查 ZIP 根目录是否包含 pack.mcmeta,并重新生成 SHA-1。

参考🔗