Posted by Aldy on 2026-06-14
Estimated Reading Time 4 Minutes
Words 1.1k In Total
Viewed Times

利用CNB免费搭建半永久Minecraft服务器

参考文章:零成本搭建“半永久”Minecraft服务器:一次对云开发平台规则的自动化探索 - Mumuemhaha Blog

高考考完累晕了。现在开始写。

前言

想整个MC服务器玩,但云服务器最便宜也得几十块一个月。
瞎刷网站,看到了上面那篇文章。用的CNB平台(cnb.cool),是腾讯的,原来估计是想对标github,但好像也不温不火。
github不是有个codespace嘛,这个也有,但是这个的配置可以很高,而且是国内服务器,可以使劲薅。

免费额度这东西

CNB的免费额度是1600核时每月。
算一下的话,4核能跑400小时,平均每天大概13个小时;8核就只有200小时了。MC服务器4核完全够用,所以选4核。
内存是自动分配的,核心数*2。4核就是8G,也不错。
磁盘256G,随便玩。
带宽国内大概5.8MB/s,国际出口一般,不过也能理解。

整体思路

核心问题有三个。

CNB没有公网IP。

这个问题搞了好久。当初我看能直接连ssh,而且codeserver也可以自己穿透端口出去,最主要的是,上面那篇博客不知道怎么回事,好像访问这个问题一下子就解决了,让我以为也很简单。搞来搞去,甚至问了上面博客的作者,最后发现,还是不行。还得老老实实穿透。

CNB是无状态的,workspace一关数据全丢。

所以要用rclone定期往MinIO S3同步数据。搞不懂,直接上claude code!

每次启动都要手动走流程

叫ai写了几个管理脚本,通过CNB的API控制workspace的生命周期。
就这一个开发环境竟然还有API可以自动开启关闭,我真的不知道腾讯怎么想的,除了自动薅羊毛这个功能还有任何用处吗

配置文件

.cnb.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$:
vscode:
- runner:
cpus: 4
docker:
build: ./Dockerfile
services:
- docker
- name: vscode
options:
keepAliveTimeout: 16h
stages:
- name: 启动脚本
script: bash /workspace/start
endStages:
- name: 保存服务器
script:
- bash /workspace/stop

注意点 有个比较坑的地方是runner.cpus必须放在docker前面,这是CNB的格式要求。看了文档里的示例配置才知道。搞不懂为什么。

Dockerfile就很简单,装Java和一些基础工具:

1
2
3
4
5
6
7
8
FROM ubuntu:22.04

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
openssh-server curl unzip openjdk-17-jdk openjdk-21-jdk \
&& rm -rf /var/lib/apt/lists/*

ENV LANG=C.UTF-8
ENV LANGUAGE=C.UTF-8

这里也踩了个坑。Dockerfile末尾把apt缓存清了,结果start脚本里又装unzip,没先apt-get update就直接install,自然是装不上的。后来把unzip直接加到Dockerfile里了事。

启动脚本

一堆事情:

  • 检查Java
  • 装rclone(没有的话自动下)
  • 配好MinIO的配置,从S3拉数据
  • 装frpc、写frp配置,启动

rclone自动安装那段是这样写的:

1
2
3
4
5
6
7
8
RCLONE_BIN="/usr/local/bin/rclone"
if [ ! -f "$RCLONE_BIN" ]; then
curl -sSL -o /tmp/rclone.zip \
"https://downloads.rclone.org/rclone-current-linux-amd64.zip"
unzip -qo /tmp/rclone.zip -d /tmp/
cp /tmp/rclone-*/rclone "$RCLONE_BIN"
chmod +x "$RCLONE_BIN"
fi

从S3恢复数据也简单,如果本地mc目录是空的而且S3上有数据,就sync下来。

frpc同理,不说了

关机和数据持久化

stop脚本做的事就是反过来:先关掉frpc,然后执行MC的save-all,最后用rclone把整个mc目录同步到S3。

1
2
3
4
5
6
7
pkill -f "frpc -c" 2>/dev/null || true

if [ -d /workspace/mc ] && [ -n "$(ls -A /workspace/mc/ 2>/dev/null)" ]; then
echo "save-all" | nc -w 2 localhost 25565 2>/dev/null || true
sleep 1
rclone sync /workspace/mc/ minio:cnb-mc-backup/minecraft/ --progress 2>&1 || true
fi

数据持久化,直接抄上面那篇博客,不用我思考了。

数据流向就是:CNB本地 -> frp隧道 -> NAS上的MinIO S3。

Minecraft服务器

按下不表了,没什么好说的。

启动命令就分配4G内存:

1
java -Xmx4G -Xms1G -jar fabric-server-mc.1.20.1-loader.0.19.2-launcher.1.1.1.jar nogui

实际运行

其实没什么人来玩。。。所以占用很少,都很少,潜力很大

核时配额的话,4核跑满24小时要96核时,1600额度大概够跑16天。
如果要全天候30天,得选2核才够,但2核的内存和性能跑MC有点勉强。
反正也就随便玩玩,估计是用不完的。

总结

真是宝藏服务啊,能连ssh的codespace真的找不到第二家了。配置还这么高,爽玩。