想和朋友长期玩 Minecraft Java 生存服,租一台 VPS 自建服务器通常比让某个人一直开着电脑稳定,也能自由安装 Paper 插件、管理地图和控制备份。但“能启动”与“能稳定开服”差别很大:CPU 单核性能、机房延迟、内存分配、视距、白名单和世界备份都会直接影响体验。
这篇教程以当前稳定的 Minecraft Java 26.2 与 Paper 26.2 为例,使用 Docker Compose 和 itzg/minecraft-server 部署。配置包括 Java 25、Paper、白名单、RCON Secret、自动世界备份、插件安装、升级和卡顿排查,适合 3-10 人的小型生存服。
先确认玩家使用的客户端,避免服务器搭好后才发现无法加入。
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 玩家都是 Windows、macOS、Linux 的 Java Edition | Paper Java 服 | 支持 Bukkit/Paper 插件,生态成熟 |
| 玩家主要使用手机、主机或 Bedrock Edition | Bedrock Dedicated Server | 默认端口和服务端程序不同,不能直接套用本文配置 |
| 同一台机器管理多个游戏服或交给多名管理员 | Pterodactyl | 有面板、资源配额、文件和用户管理,但部署更复杂 |
| 只运行一个 3-10 人的 Java 生存服 | 本文 Docker Compose | 组件少、升级和迁移路径清晰 |
Paper 是面向生产服务器的 Minecraft Java 服务端,提供更好的性能、配置能力和插件 API。它不是模组加载器;需要 Forge、NeoForge 或 Fabric 模组包时,服务端类型、Java 版本与客户端模组必须重新匹配。
如果要管理多个 Minecraft、Rust 或 CS2 实例,可继续看VPS 搭建 Pterodactyl 游戏服务器面板。
Minecraft 服务端的主游戏循环对单核性能敏感。与其购买很多低频共享 vCPU,不如优先选择高主频、稳定性能的 CPU、NVMe 磁盘和靠近玩家的机房。
| 规模 | 建议 VPS | Java 堆内存 | 建议视距 |
|---|---|---|---|
| 2-4 人纯生存、少量插件 | 2-4 核、4-6GB、40GB NVMe | 3-4GB | 6-8 |
| 5-10 人、常用管理插件 | 4 核、8GB、60GB NVMe | 6GB | 8 |
| 10-20 人、红石农场或频繁探索 | 4-6 个高性能核心、12-16GB | 8-12GB | 先从 6-8 测试 |
| 大型模组包或公开服 | 单独压测 | 按模组包要求 | 不要直接套用本文参数 |
Java 堆内存不能吃满整台 VPS。容器、JVM 非堆内存、Docker 和 Linux 都需要空间;itzg/minecraft-server 文档建议总体容器内存还要为非堆部分预留约 25%。本文按 8GB VPS 分配 MEMORY=6G。
机房位置优先靠近主要玩家。购买前可以结合游戏服务器 VPS 推荐与配置指南判断线路、DDoS 防护和单核性能。
系统以 Ubuntu 24.04 LTS 为例。Minecraft Java 默认使用 TCP 25565,安全组和宿主机防火墙都要允许这个端口。
如果希望玩家用域名加入,给 mc.example.com 添加 A 记录指向 VPS 公网 IPv4。使用 Cloudflare DNS 时设为 DNS only,普通橙云代理不转发 Minecraft TCP 流量。
检查端口是否被占用:
sudo ss -lntp | grep ':25565'
没有输出才继续。然后安装 Docker Engine 与 Compose v2,并确认版本:
docker --version
docker compose version
创建数据、备份和 Secret 目录:
sudo mkdir -p /opt/minecraft/{data,backups,secrets}
sudo chown -R "$USER":"$USER" /opt/minecraft
cd /opt/minecraft
openssl rand -base64 36 > secrets/rcon_password
chmod 600 secrets/rcon_password
RCON 用于安全停服、执行控制台命令和协调备份。本文不会把 25575 映射到公网,备份容器只通过 Compose 内部网络访问它。
如果你还不熟悉生产环境里的健康检查、日志轮转、资源边界和 Secret 管理,可以先看VPS Docker Compose 生产环境配置指南。下面的配置针对 Minecraft 做了固定版本、持久化、健康依赖和备份编排。
创建 /opt/minecraft/compose.yaml:
services:
mc:
image: itzg/minecraft-server:2026.5.4-java25
container_name: minecraft-paper
restart: unless-stopped
tty: true
stdin_open: true
ports:
- "25565:25565/tcp"
environment:
EULA: "TRUE"
TYPE: "PAPER"
VERSION: "26.2"
MEMORY: "6G"
ONLINE_MODE: "TRUE"
ENABLE_WHITELIST: "TRUE"
ENFORCE_WHITELIST: "TRUE"
WHITELIST: |-
PlayerName1
PlayerName2
MAX_PLAYERS: "10"
VIEW_DISTANCE: "8"
SIMULATION_DISTANCE: "6"
DIFFICULTY: "normal"
MOTD: "Private survival server"
ENABLE_RCON: "TRUE"
RCON_PASSWORD_FILE: /run/secrets/rcon_password
STOP_SERVER_ANNOUNCE_DELAY: "30"
TZ: "Asia/Shanghai"
volumes:
- ./data:/data
secrets:
- rcon_password
stop_grace_period: 90s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
backups:
image: itzg/mc-backup:latest
container_name: minecraft-backups
restart: unless-stopped
depends_on:
mc:
condition: service_healthy
environment:
RCON_HOST: mc
RCON_PASSWORD_FILE: /run/secrets/rcon_password
BACKUP_NAME: minecraft-paper
BACKUP_INTERVAL: "6h"
INITIAL_DELAY: "0"
PRUNE_BACKUPS_DAYS: "7"
TZ: "Asia/Shanghai"
volumes:
- ./data:/data:ro
- ./backups:/backups
secrets:
- rcon_password
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
secrets:
rcon_password:
file: ./secrets/rcon_password
这里固定了 Minecraft 服务端镜像的工具版本和 Java 25,同时把游戏版本固定为 26.2。Paper 官方说明 26.1 及以上需要 Java 25;如果要运行 1.20 至 1.21.11 的旧世界或旧插件,应改用 Java 21 镜像并重新核对兼容性。
itzg/mc-backup 的 latest 标签会变化。首次验证稳定后,可以用 docker image inspect 记录当前 RepoDigest,再在生产配置中固定摘要。不要在没有完整备份时自动追随未知大版本。
设置 EULA=TRUE 表示接受 Minecraft EULA。上线前应阅读当前 EULA 与 Usage Guidelines,并确保服务器的收费、内容和品牌使用符合要求。
先解析 Compose 并拉取镜像:
cd /opt/minecraft
docker compose config >/dev/null
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f mc
第一次启动会下载 Paper 26.2 并生成世界。日志出现类似 Done 后按 Ctrl+C 退出日志,不会停止容器。
确认容器健康、版本和玩家列表:
docker compose ps
docker compose exec mc rcon-cli version
docker compose exec mc rcon-cli list
docker compose exec mc rcon-cli whitelist list
mc 应显示 healthy。备份容器会等待游戏服健康后再连接 RCON。
在 VPS 云防火墙中允许 TCP 25565。使用 UFW 时可以添加:
sudo ufw allow 25565/tcp
sudo ufw status numbered
Docker 发布端口可能绕过单纯的 UFW INPUT 规则,因此还要检查云防火墙和 Docker 的转发链。本文只发布 25565;RCON 25575、Docker API 和 SSH 管理端口绝不能无保护暴露。
从另一台网络中的电脑测试:
nc -vz mc.example.com 25565
玩家在 Minecraft Java Edition 的多人游戏中添加:
mc.example.com
默认端口 25565 不需要写在地址后面。使用其他端口时,玩家需要填写 域名:端口,或者额外配置 SRV 记录。
私人服务器应默认启用白名单。Compose 中的 WHITELIST 会在初始化时解析用户名;正式上线前替换示例玩家名。
运行时添加或删除玩家:
docker compose exec mc rcon-cli whitelist add PlayerName
docker compose exec mc rcon-cli whitelist remove PlayerName
docker compose exec mc rcon-cli whitelist list
授予管理员权限:
docker compose exec mc rcon-cli op PlayerName
docker compose exec mc rcon-cli deop PlayerName
只给可信管理员 OP。普通玩家需要传送、领地或基础命令时,使用权限插件按最小权限授权,不要为了省事全部设为 OP。
保持 ONLINE_MODE=TRUE,让服务器验证玩家账号。关闭在线验证会失去官方身份校验,可能导致冒名登录、背包和权限混乱;代理网络有特殊需求时应按 Velocity/Paper 的安全转发方案配置,而不是直接关闭。
Paper 插件放在宿主机目录:
/opt/minecraft/data/plugins/
安装流程:
- 只从插件官网、Hangar、Modrinth 或项目 GitHub 下载;
- 确认插件明确支持 Paper 26.2 与 Java 25;
- 先执行一次世界备份;
- 把 JAR 放入
data/plugins/; - 完整重启服务器并检查日志。
docker compose exec backups backup now
docker compose restart mc
docker compose logs --tail=200 mc
docker compose exec mc rcon-cli plugins
不要使用 /reload 或热插拔插件。Paper 文档明确说明运行时重载不受支持;插件升级、删除和依赖变化都应通过完整重启完成。
每次只改一个插件,记录版本和下载来源。若服务器开始崩溃或 TPS 下降,先回退最后一次变更,而不是同时替换全部插件。
itzg/mc-backup 会通过 RCON 执行保存命令、暂停世界写入、打包数据,然后恢复写入。本文每 6 小时备份一次,并保留 7 天。
查看备份状态:
docker compose logs --tail=200 backups
ls -lh /opt/minecraft/backups
立即创建一次备份:
docker compose exec backups backup now
本机备份无法应对 VPS 磁盘损坏、账号封禁或机房事故。把 /opt/minecraft/backups 加密同步到另一家对象存储或异地服务器,并设置独立保留周期。更完整的异地备份与恢复演练可参考VPS 备份恢复演练指南。
不要直接在生产世界上测试覆盖恢复。准备一台测试 VPS 或新的空目录:
- 复制
compose.yaml、Secret 和选定备份; - 保持测试机 25565 不对公网开放,或换到其他端口;
- 确认
data目录为空; - 用备份镜像的
restore-tar-backup恢复最新归档; - 启动
mc,验证世界、背包、末影箱、插件数据和白名单。
恢复前先列出归档,确认时间与大小合理。世界能加载不代表恢复完整,还要进入不同维度并检查插件数据库。
Minecraft 26.2 和 Paper 的世界格式升级可能不可逆。Paper 26.2 发布说明明确要求升级前备份,并指出升级到 26.2 后不能降级到更低版本。
安全升级流程:
cd /opt/minecraft
docker compose exec backups backup now
docker compose exec mc rcon-cli save-all flush
docker compose stop mc
# 修改 VERSION 或镜像标签前,先核对 Paper 与插件兼容性
docker compose pull
docker compose up -d mc
docker compose logs -f mc
验收世界、三个维度、玩家数据和插件后,再启动备份服务:
docker compose up -d backups
docker compose ps
不要直接把 VERSION 改为 LATEST 后无人值守重启。先在备份副本上测试新版本,尤其要检查经济、权限、领地和跨版本地图插件。
Paper 的目标 TPS 是 20;MSPT 低于 50 才能维持 20 TPS。卡顿时先采集数据:
docker stats --no-stream
docker compose exec mc rcon-cli tps
docker compose exec mc rcon-cli mspt
docker compose exec mc rcon-cli "spark profiler start --timeout 300"
让问题在 5 分钟采样期间真实发生,结束后查看 spark 返回的报告链接。不要看到内存占用高就立即加 RAM;区块生成、实体、漏斗、红石、某个插件和磁盘 I/O 都可能是瓶颈。
优先按这个顺序处理:
- 把
VIEW_DISTANCE从 8 降到 6; - 把
SIMULATION_DISTANCE从 6 降到 4; - 限制实体密集农场和持续加载区块;
- 根据 spark 报告更新或移除高占用插件;
- 为频繁探索的服务器预生成世界边界;
- 确认 VPS 没有 CPU steal、磁盘 I/O 或内存换页问题。
单纯增加 Java 堆可能延长垃圾回收时间。调整内存后至少经历一次高峰期,再比较 TPS、MSPT 和 spark 报告。
docker compose ps
docker compose logs --tail=200 mc
sudo ss -lntp | grep ':25565'
本机已监听但外部超时时,检查云防火墙、宿主机转发规则和域名解析。域名若误开 Cloudflare 普通代理,应改为 DNS only。
客户端必须使用与服务端兼容的 Minecraft Java 版本。检查:
docker compose exec mc rcon-cli version
grep '^VERSION' compose.yaml
不要用 Bedrock 客户端直接连接 Java 服务端。需要跨版本或基岩互通时,应单独评估 ViaVersion、Geyser 和 Floodgate 的兼容性与身份安全。
docker compose logs --tail=300 mc
docker compose config
常见原因包括未接受 EULA、Paper 版本不存在、Java 版本错误、Secret 路径错误和数据目录权限问题。不要删除 data 目录“重装”,其中包含世界与玩家数据。
确认两个服务挂载同一个 rcon_password Secret,并且 RCON_HOST=mc。修改 Secret 后重建两个容器:
docker compose up -d --force-recreate mc backups
docker compose logs --tail=100 backups
不要映射 25575 到公网测试;在 Compose 内部网络排查即可。
整机 CPU 百分比会掩盖单个核心已经跑满的情况。运行 spark 分析主线程,检查新生成区块、实体 AI、漏斗、红石和插件任务。多买几个慢核心通常不能解决主线程瓶颈。
- Minecraft Java 版本、Paper 版本和 Java 25 兼容
- 25565/TCP 从外部网络可达,RCON 25575 未暴露公网
- 域名使用 DNS only,解析到正确 VPS
- 白名单已启用,示例玩家名已替换
-
ONLINE_MODE=TRUE,仅可信管理员拥有 OP -
data持久化,重建容器后世界仍存在 - 自动备份能成功执行,并有异地副本
- 已在测试目录完成一次恢复演练
- 插件来源、版本和兼容性有记录
- 升级前完成备份并验证不可降级风险
- 高峰期 TPS 接近 20,MSPT 保持在 50 以下
完成这些检查后,这台 VPS 才算是一套可长期维护的 Minecraft Java 服务器,而不只是临时开服。小型生存服最重要的不是堆满插件或无限加内存,而是稳定单核性能、合理视距、严格白名单和真正能恢复的世界备份。
