0. 先说下我这套东西跑在啥上面
- NAS:绿联云 DX4600,系统是 UGOS,全靠 Docker
- 内网穿透:樱花 FRP,白嫖的免费节点
- 目标:Java 版和基岩版都能进,不开正版验证,PVP 和生电机器都得能玩
1. MC 服务器怎么搭起来的
镜像用的 itzg/minecraft-server,这玩意儿贼省心,环境变量填好就自己跑。1.21.11 用 :java21 标签,后来升 26.1.2 换了 :latest(里面是 Java 25)。
几个关键环境变量:
TYPE: CUSTOM
CUSTOM_SERVER: /data/purpur-26.1.2.jar
MEMORY: 18G
MOTD: 教培群群服
ONLINE_MODE: false
OPS: BadPaul_
NAS 上的 /volume1/mcserver_docker 挂载到容器里的 /data,存档、插件、配置全在这。
踩的第一个坑:如果 TYPE 填 PAPER 或 PURPUR,镜像每次重启都会自己上网下载核心 jar。问题是国内连 papermc.io 经常超时,日志里躺一片 connection timed out。解决:自己用电脑下好 jar 传 NAS 上,TYPE 改成 CUSTOM,CUSTOM_SERVER 指向 jar 路径,从此启动飞快。
踩的第二个坑——权限:绿联 Docker 给挂载目录默认套了个 ACL 锁,容器里 uid=1000 的用户完全写不进去,日志鬼畜循环 Permission denied。搞了好久,最后删了旧目录换新路径、容器开特权模式才消停。
2. 服务端换来换去的心路历程
| 顺序 | 用的啥 | 为啥换 |
|---|---|---|
| 一开始 | Vanilla 1.21.11 | 原版,啥也没有 |
| 第二次 | Paper 1.21.11 | 想要插件,SkinsRestorer 修离线皮肤 |
| 最终 | Purpur 26.1.2 | 比 Paper 多几个生电开关,刷沙刷线都能开 |
最后定在 Purpur 的原因:Paper 封了好多原版特性,Purpur 用 purpur.yml 把一部分给回来了。小群 PVP 加生电,目前最满意这套。
3. 樱花 FRP 穿透怎么配的
Docker 直接跑 natfrp.com/launcher,网络必须选 host 模式。
环境变量就俩:
NATFRP_TOKEN: ak-xxxxxxxx ← 官网管理面板里复制
NATFRP_REMOTE: 自己设的密码 ← 等会儿远程管理登录用
隧道我建了两条:
| 干啥用 | 类型 | 本地端口 | 最终地址长这样 |
|---|---|---|---|
| Java 版 | TCP | 34629(容器里是 25565) | frp-tag.com:52780 |
| 基岩版 | UDP | 19132 | frp-web.com:24706 |
一个小技巧:基岩版可以建多条 UDP 隧道,每条选不同节点(枣庄、广州、成都各来一条),全部指向同一个本地 19132。玩家看自己离哪近就连哪条,Docker 端口映射完全不用动。
隧道建好之后,去 远程管理页面 用刚才那个密码登录,双击隧道才真正启动,地址会弹出来。
4. 基岩版互通(手机也能进!)
全靠 Geyser + Floodgate 这俩插件。去官网下 jar 扔进 plugins/ 文件夹就行:
- Geyser-Spigot.jar — 把基岩版的包翻译成 Java 版能懂的
- Floodgate-Spigot.jar — 基岩版玩家不用买正版直接进
容器里记得加一条 UDP 端口映射 19132 → 19132。启动日志里看到 Started Geyser on UDP port 19132 就是成了。
注意:手机端填的是樱花给的 UDP 地址和端口,不是 19132。之前被这个问题卡了半天,日志有连接但秒断,最后发现是 FRP 免费节点 UDP 不稳定,换个节点就好了。
5. 都装了哪些插件
| 插件 | 干嘛的 |
|---|---|
| SkinsRestorer | 离线模式下正版玩家皮肤能正常显示,离线玩家也能 /skin 换皮 |
| Geyser + Floodgate | 手机基岩版直连,不用正版 |
| GrimAC | 开源反作弊,异步跑不吃性能,不会误判 TNT 复制 |
| WorldEdit | 大范围操作 + 跨存档搬机器,后面细说 |
还有几个推荐但这次没装的:LuckPerms(权限管理)、EssentialsX(/home /tpa /spawn)、CoreProtect(查熊孩子 + 一键回档)。
6. 把被 Paper 修掉的生电特性搞回来
默认情况下 Paper 和 Purpur 把 TNT 复制、破基岩、刷沙这些都关了。改配置文件就行。
文件一:paper-global.yml
unsupported-settings:
allow-headless-pistons: true # 无头活塞
allow-permanent-block-break-exploits: true # 破基岩
allow-piston-duplication: true # TNT 复制 / 地毯复制
文件二:purpur.yml(只有 Purpur 有这个)
piston:
allow-tripwire-disarming: true # 刷线机
allow-gravity-block-duplication: true # 刷沙子/混凝土粉末
改完重启,生电机器全部复活。注意 Paper 26.1 以后删掉了一些选项(比如重力方块复制),所以要用 Purpur。
7. 怎么把旧存档的机器搬到新服
WorldEdit 的 schematic 功能,选中区域导出成文件,到新服粘贴。
- 装 WorldEdit,拿到木斧(
//wand) - 左键点机器一角,右键点对角,框住整台机器
//copy→//schem save 机器名- .schem 文件在
plugins/WorldEdit/schematics/里 - 到新服站好位置 →
//schem load 机器名→//paste
箱子里的东西、朝向全部保留。如果旧存档在另一个文件夹,装个 Multiverse-Core 把旧世界挂成额外维度就能进去导。
8. 一些日常操作备忘
| 要干啥 | 怎么干 |
|---|---|
| 给自己 OP | 终端里 rcon-cli op BadPaul_ |
| 调难度 | 游戏里 /difficulty hard |
| 切生存模式 | /gamemode survival @p |
| 备份世界 | cp -r /data/world /data/world_backup |
| 换端后背包丢了 | UUID 变了,去 playerdata 里 cp 旧的 .dat 到新的 |
| Paper 迁移报冲突 | 删掉 world/dimensions/ 让 Paper 重新迁移 |
9. 从 1.21.11 升到 26.1.2 的教训
这两个版本之间跨度巨大,Mojang 连版本号命名都改了。Paper 自动迁移世界格式的时候容易炸,尤其是手贱"暴力覆盖"了文件夹之后,新旧文件打架直接报错循环。
教训总结:
- 升级前一定备份 world/ 文件夹,别偷懒
- 迁移失败就删
world/dimensions/,这是半成品产物,删了让 Paper 重来 - 如果实在迁不动,回退 1.21.11 就行——你的房子、箱子全在
world/region/*.mca里,不会丢 - 26.1.2 需要 Java 25,itzg 镜像用
:latest就是 Java 25;1.21.11 用:java21
10. 最终跑起来的样子
玩家(Java版) ──TCP──→ frp-tag.com:52780 ──→ 绿联NAS → Docker mc-server
玩家(基岩版) ──UDP──→ frp-web.com:24706 ──→ Geyser → 同一个服务器
Docker 里跑着俩容器:
├── mc-server(Purpur 26.1.2,18G 内存)
│ ├── /data/plugins/ ← 各种插件 jar
│ ├── /data/world/ ← 主世界存档,你的房子在这
│ └── /data/config/ ← paper-global.yml、purpur.yml
│
└── sakurafrp(樱花启动器,host 网络)
├── TCP 隧道 → Java 玩家
└── UDP 隧道 → 基岩版玩家(可以多条)
11. 有用的链接
- 樱花 FRP 管理面板:natfrp.com/user/
- 樱花 FRP 远程管理(启动隧道用):natfrp.com/remote/v2
- itzg 镜像文档:docker-minecraft-server.readthedocs.io
- Geyser 下载:geysermc.org
- Purpur 下载:purpurmc.org

Comments NOTHING