MC 服务器搭建(本地服务器环境+FRP)

这里的"爬虫", 我之前参考过 HMCL 的实现, 你不熟悉Java, 也可以尝试看看,
里边有 整理好的API 和 逻辑 可以参考

3 Likes

可以修改帖子1的内容的。不用新开贴写教程

1 Like

1.92的 :tieba_003:

现在1.23.4 了, 看看有必没必要升级一下 ? :tieba_022:

太感谢了,不用造轮子了

5 Likes

OK!嘿嘿嘿

2 Likes

膜拜,膜拜 :face_with_peeking_eye:

2 Likes

哈哈 等我问问搭子们 :tieba_087:

1 Like

树莓派的系统和环境 :seedling:

  1. [树莓派系统安装](#树莓派系统安装 :rocket:) :hammer_and_wrench:

  2. [SSH连接](#SSh连接 :key:) :link:

  3. [环境安装](#环境安装 :thinking:) :link:

树莓派系统安装 :rocket:

安装工具(Raspberry Pi Imager)

​ • Download for Windows

​ • Download for macOS

​ • Download for Ubuntu for x86

根据自己的电脑系统选择下载 :point_up_2:

选择板子类型

​ • 我用的是树莓派5(8G内存的板子, 可以玩mod啦, 真棒!:video_game:

选择服务器系统

​ • 选择:Other general-purpose OS → Ubuntu 24.10

格式化SD卡

:warning: 务必选择自己的读卡器显示的SD卡!小心误操作。

网络配置和SSH配置

​ • 点击 NEXT, 进入编辑设置:

GENERAL 系统设置:

主机名: Lin (举个:chestnut:)

用户名: Lin (举个:chestnut:)

密码: zhanglin (举个:chestnut:)

热点名称: Lin (视实际情况填写)

密码: zhanglin (视实际情况填写)

Wi-Fi国家: CN

时区: 国内时间

SERVICES 设置:

- 开启SSH服务

- 使用密码登录

​ • 保存 → 点击确认 → 等待烧录完成 :clock3:

完成烧录后

​ 1. 弹出SD卡 :white_check_mark:

​ 2. 插入树莓派 → 开机 → 等待系统安装, 大概需要30分钟左右 :hourglass_flowing_sand:

SSH连接 :key:

1. 下载局域网 IP 扫描工具

根据你的设备选择工具:

​ • Mac: Lanscan :apple:

​ • Windows: Advanced IP Scanner :desktop_computer:

​ • Android: IP扫描器 :iphone:(Google Play下载)

2. 开启手机热点

确保热点名称和密码与之前的配置一致 :globe_with_meridians:

注意:苹果热点问题 :thinking:

​ • 苹果手机热点需保持WiFi处于灰色激活状态。

​ • 打开“兼容性”选项, 解决频段问题(如2.4G和5G)。

3. 扫描局域网 IP

使用 IP 扫描工具查找热点设备, 通常树莓派的设备名会带有:

Raspberry Pi (Trading) Ltd

记录树莓派的 IP 地址 :1234:

4. 连接树莓派

在命令行中输入:

ssh Lin@<IP地址>

输入密码 zhanglin。

:star2: 输入密码时不显示内容, 是正常的, 以前不知道 :person_shrugging:

环境安装 :thinking:

:hammer_and_wrench: 环境搭建

设置 SSH Root 登录 :door::key:

为了方便操作, 先配置 root 用户的登录权限。

​ 1. 设置 root 密码 :lock:

​ 运行以下命令, 设置 root 密码:

sudo passwd root

​ 2. 启用 SSH 的 root 登录 :open_file_folder::writing_hand:

​ 修改 SSH 配置文件, 允许 root 登录:

sudo vim /etc/ssh/sshd_config

​ • 按 esc 再按 ? 开启搜索模式, 输入 PermitRootLogin 找到对应位置。

​ • 按 i 进入插入模式, 将内容修改为:

PermitRootLogin yes

ListenAddress 0.0.0.0

​ • 按 esc 键, 输入 :wq 保存退出。

​ 3. 重启 SSH 服务 :arrows_counterclockwise:

sudo systemctl restart ssh

​ 4. 切换到 root 用户 :technologist:

​ 设置完成后, 可以直接切换到 root 用户:

su root

​ 或直接用 SSH 登录:

ssh root@IP

密码是之前设置的 root 密码。

:package: 安装环境

:coffee: Java 环境

根据 MC 服务器的需求配置 Java 环境。我看 MC 1.21+ 需要 JDK 21, 跟 MC 版本号对上了, 也不知道是谁适配谁……

​ 1. 查看可用的 Java 包

apt install openjdk-

​ 按几次 Tab 键会显示可用包。

​ 2. 安装无界面的 JRE 版本

apt install openjdk-21-jre-headless -y

​ 3. 检查安装是否成功

java -version

​ 如果提示找不到包, 可以尝试更新源后重试:

apt update

:rocket: Aria2 环境

用于下载 MOD, 支持文件列表并且速度快:

apt install aria2 -y

:video_game: Minecraft 环境搭建

以 NeoForge 为例, 其他服务器核心方法类似。

​ 1. 创建服务器目录 :card_index_dividers:

​ 在 /home 路径下创建 mc_server 目录:

cd /home

mkdir mc_server

cd mc_server

​ 2. 下载 NeoForge 核心 :hammer_and_wrench:

​ 下载对应 MC 版本的核心文件, NeoForge 21.1 对应 MC 1.21.1:

aria2c https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.83/neoforge-21.1.83-installer.jar

​ 3. 安装服务器核心 :wrench:

​ 下载完成后确认文件路径:

pwd

​ 是的话, 输入 java -jar neoforge-

​ 然后按 tab 键就可以补全了, 再加上 -h 就可以看到安装的命令了

​ 我们只需安装服务端就OK了 –install-server

java -jar neoforge- 
java -jar neoforge-21.1.83-installer.jar -h

​ 完整的命令如下

java -jar neoforge-21.1.83-installer.jar --install-server

​ ok!等待安装完成。。。。

​ 4. 配置 JVM 参数 :cn:

​ 安装完成后, 修改内存配置。编辑 user_jvm_args.txt 文件:

vim user_jvm_args.txt

​ • 按 esc 后输入 :%d 清空注释(可选)。

​ • 填入内存设置, 例如:

-Xmx5G

​ • 保存并退出(按 esc, 输入 :wq)。

​ 5. 同意 EULA 条款 :white_check_mark:

​ 首次运行服务器会提示未同意条款, 需要修改 eula.txt 文件:

./run.sh
vim eula.txt

​ 将 eula=false 修改为 eula=true, 然后保存退出。

​ 6. 启动服务器 :tada:

​ 运行核心提供的启动脚本:

./run.sh

​ 如果没有报错说明服务端运行成功!

:checkered_flag: 小结

​ 跑通后, 基本环境就搭好了!接下来可以折腾各种配置、MOD、定时任务等, 慢慢完善自己的服务器吧~ :balloon::sparkles:

MC 配置文件和 MOD下载 :video_game:

  1. [基本配置文件](#基本配置文件 :open_file_folder:)
  2. [MOD 下载](#MOD 下载 :satellite:)

基本配置文件 :open_file_folder:

​ 1. word 文件夹

​ 保存世界生成文件, 可以自定义, 备份的时候, 备份这个就行了。

​ 2. mod 文件夹

​ 下载的mod文件存放于此。

​ 3. server.properties 配置文件

​ 包含游戏重要设置, 如下:

// 允许飞行
allow-flight=false

// 允许进入下界
allow-nether=true

// 将控制台消息广播给所有操作员
broadcast-console-to-ops=true

// 将RCON消息广播给所有操作员
broadcast-rcon-to-ops=true

// 游戏难度
difficulty=hard

// 启用命令方块
enable-command-block=false

// 启用JMX监控
enable-jmx-monitoring=false

// 启用查询
enable-query=false

// 启用RCON
enable-rcon=false

// 启用服务器状态
enable-status=true

// 强制使用安全配置文件
enforce-secure-profile=true

// 强制使用白名单
enforce-whitelist=false

// 实体广播范围百分比
entity-broadcast-range-percentage=100

// 强制游戏模式
force-gamemode=false

// 函数权限等级
function-permission-level=2

// 游戏模式
gamemode=survival

// 生成结构
generate-structures=true

// 生成器设置
generator-settings={}

// 极限模式
hardcore=false

// 隐藏在线玩家
hide-online-players=false

// 初始禁用的资源包
initial-disabled-packs=

// 初始启用的资源包
initial-enabled-packs=vanilla

// 世界名称
level-name=world

// 世界种子
level-seed=

// 世界类型
level-type=minecraft\:normal

// 记录IP地址
log-ips=true

// 最大链式邻居更新次数
max-chained-neighbor-updates=1000000

// 最大玩家数量
max-players=3

// 最大游戏刻时间
max-tick-time=60000

// 最大世界大小
max-world-size=29999984

// 服务器名称
motd=§6呀\!\n  §3开始

// 网络压缩阈值
network-compression-threshold=256

// 在线模式(额, 就是有账号的话, 可以开启, 没有的话, 关上就行了)
online-mode=false

// 操作员权限等级
op-permission-level=4

// 玩家空闲超时时间
player-idle-timeout=0

// 防止代理连接
prevent-proxy-connections=false

// 玩家对战
pvp=true

// 查询端口
query.port=25566(额, 端口号)

// 速率限制
rate-limit=0

// RCON密码
rcon.password=

// RCON端口
rcon.port=25575

// 要求资源包
require-resource-pack=false

// 资源包
resource-pack=

// 资源包ID
resource-pack-id=

// 资源包提示
resource-pack-prompt=

// 资源包SHA1
resource-pack-sha1=

// 服务器IP
server-ip=

// 服务器端口
server-port=25566

// 模拟距离
simulation-distance=10

// 生成动物
spawn-animals=true

// 生成怪物
spawn-monsters=true

// 生成NPC
spawn-npcs=true

// 生成保护
spawn-protection=16

// 同步区块写入
sync-chunk-writes=true

// 文本过滤配置
text-filtering-config=

// 使用本地传输
use-native-transport=true

// 视距
view-distance=10

// 白名单
white-list=false

​ 4. 服务器名称 (就是:point_up_2:这个配置项里面的 motd )

​ 这个可以设置彩色的文字, 还有各种配置项, 列出一些供参考, 用这些代码开头就可以了

§0 黑色
§1 深蓝色
§2 深绿色
§3 湖蓝色
§4 深红色
§5 紫色
§6 金色
§7 灰色
§8 深灰色
§9 蓝色
§a 绿色
§b 天蓝色
§c 红色
§d 粉红色
§e 黄色
§f 白色

§k 随机字符
§l 加粗
§m 删除线
§n 下划线
§o 斜体
§r 重置格式

// 例子
motd=§6欢迎来到§e§l我的世界§6服务器\!\n  §a§l开始你的冒险吧\!

motd=§c§l火焰§6§l之域\!\n  §b§l加入我们, 点燃你的激情\!

motd=§d§l梦幻§5§l仙境\!\n  §e§l探索无尽的奇迹\!

​ 5. run.sh 启动脚本

​ 这个文件就是启动的脚本, 我们可以看一下里面是怎么启动的。遇到其他类型的服务器核心 fabric、paper 啥的, 就可以自己写一个了。

cat run.sh 

​ 输出: 我先翻译成中文了, 额, 还是看不懂, 问下GPT吧。

#!/usr/bin/env sh
# Forge 需要配置一组 JVM 和程序参数。
# 将自定义 JVM 参数添加到 user_jvm_args.txt 文件中
# 将自定义程序参数(例如 nogui)添加到此文件的下一行, 位于 "$@" 之前, 或者

java @user_jvm_args.txt @libraries/net/neoforged/neoforge/20.4.237/unix_args.txt "$@"

​ 看到, 主要是后面的代码 java @… @ … “$G” 我也不是写Java的, 也不明白什么意思, 直接照葫芦画样子了。

​ 第一个参数: Java 选择解释器运行, 和 python 一样的。

​ 第二个参数: @user_jvm_args.txt, 这个事读取这个文件的内容, 里面是什么, 读出来就是什么, 看一下

cat user_jvm_args.txt

​ 输出:这个是我们设置的运行允许的最大内存。

-Xmx5G

​ 第三个参数: @libraries/net/neoforged/neoforge/20.4.237/unix_args.txt

额额, 在这个路径下, 进去看看 :eyes:

cat libraries/net/neoforged/neoforge/20.4.237/unix_args.txt

​ 输出: 好多内容啊。。。。。看来是neoforge的一些配置项。不管了(有大佬的话, 帮帮我)。那个对应的核心文件应该会给出来的, 或者直接就有运行脚本文件了。

​ 6. 其他配置项

​ whitelist.json: 这个需要在上面的:point_up_2:配置文件里面设置为true (enforce-whitelist=false)

​ …

​ 7. 添加服务器图片

​ 图拍是, png格式(64x64, 256x256), 然后放在服务器根目录下, 名称:point_down:这样

**server-icon.png**

MOD 下载 :satellite:

终于是可以安装mod了。看看最大的两个资源网站吧。

​ • CurseForge

​ • Modrinth

Curseforge mod 的基本链接这样组成的。有规律可循

mod_id = 1234567
mod_version = 'waystones-neoforge-1.20.4-16.0.5.jar'
url = f'https://mediafilez.forgecdn.net/files/{mod_id[:4]}/{mod_id[4:]}/{mod_version}'

Modrinnth mod 的基本链接这样的。没有规律可循

url = 'https://cdn.modrinth.com/data/example-id/versions/version-id/example-mod.jar'

根据上面这些:point_up_2:

策略是找到自己需要mod名称, 根据名称再去拿对应版本的mod, 写一个爬虫脚本就OK。

针对Curseforge有CF验证:eyes:, 这个挂上代理就可以了, 或者用自动化浏览器。

Curseforge的爬虫:lizard::

from curl_cffi import requests
from parsel import Selector
from json import loads, dump


def get_basic_data(mod_id, slug):
    print('1. Forge')
    print('4. Fabric')
    print('5. Quilt(都没用过)')
    print('6. Neoforge')
    
    gameFlavorId = input('请输入要下载的类型序号: ')
    gameVersionId = input('请输入要下载的版本号(例:1.20.1): ')
    data_version = {'1.21.3': 12084, '1.21.1': 11779, '1.21': 11457, '1.20.6': 11198, '1.20.5': 11163, '1.20.4': 10407, '1.20.3': 10395, '1.20.2': 10236, '1.20.1': 9990, '1.20': 9971, '1.19.4': 9776, '1.19.3': 9550, '1.19.2': 9366, '1.19.1': 9259, '1.19': 9186, '1.18.2': 9008, '1.18.1': 8857, '1.18': 8830, '1.17.1': 8516, '1.17': 8152, '1.16.5': 8203, '1.16.4': 8134, '1.16.3': 8056, '1.16.2': 8010, '1.16.1': 7892, '1.16': 7890, '1.15.2': 7722, '1.15.1': 7675, '1.15': 7664, '1.14.4': 7469, '1.14.3': 7413, '1.14.2': 7361, '1.14.1': 7344, '1.14': 7318, '1.13.2': 7132, '1.12.2': 6756, '1.12.1': 6711, '1.12': 6580, '1.11.2': 6452, '1.11': 6317, '1.10.2': 6170}    
    params = {
        'pageIndex': '0',
        'pageSize': '20',
        'sort': 'dateCreated',
        'sortDescending': 'true',
        'removeAlphas': 'true',
        'gameFlavorId': gameFlavorId,
        'gameVersionId': data_version[gameVersionId]
    }
    response = requests.get(f'https://www.curseforge.com/api/v1/mods/{mod_id}/files', params=params, impersonate='chrome123').json()
    data = response['data']
    if data:
        data = data[0]
        content = requests.get(f'https://mediafilez.forgecdn.net/files/{str(data["id"])[:4]}/{str(int(str(data["id"])[4:]))}/{data["fileName"]}').content
        with open(f'./mod/{slug}_{gameVersionId.replace('.', '-')}.jar', 'wb')as file:
            file.write(content)
        print('保存完成')
    else:
        print('没有改版本')
            
def search_mod_name(name):
    params = {
        'gameId': '432',
        'index': '0',
        'classId': '6',
        'filterText': name,
        'pageSize': '20',
        'sortField': '1',
    }
    response = requests.get(f'https://www.curseforge.com/api/v1/mods/search', params=params, impersonate='chrome123').json()
    total = response['pagination']['totalCount']
    print(f'✨总 数:\t{total}\n')
    datas = response['data']

    for data in datas[:5]:
        print('#'*15 + f" 序号: {datas.index(data) + 1} " + '#'*15)
        print(f"名 称:\t{data['slug']}")
        down_num = format_number(data["downloads"])
        print(f'下载量:\t{down_num}')
        
    return datas[int(input('请输入要下载的mod序号: '))-1]['id'], data['slug']
    
    
def format_number(value):
    if value >= 1_000_000:
        return f"{value / 1_000_000:.1f}M".rstrip('0').rstrip('.')
    elif value >= 1_000:
        return f"{value / 1_000:.1f}K".rstrip('0').rstrip('.')
    else:
        return str(value)

if __name__ == "__main__":
    mod_name = input('✨请输入要下载的mod名称: ')
    index, slug = search_mod_name(mod_name)
    get_basic_data(index, slug)

接下的内容

  1. Modrinth 网站的mod 下载器
  2. IPv6测试
  3. FRP穿透(cf免费穿透、自建服务器穿透、第三方穿透)
  4. 域名挂载
  5. 自动备份和自启动脚本
  6. 大型mod的稳定性测试
  7. 。。。。。。。。。
5 Likes

然而我玩GTNH,树莓派根本带不动

9 Likes
6 Likes

只是正常完,没有弄很多的自动工厂,格雷科技没测试,等我测试完后,来给你个答案

6 Likes

GTNH带不动可太正常了,一旦自动化起来,有的还需要来点高频红石,分分钟卡服,我手头的2697V4+16G内存条的服务器都带不动这个(带宽200M)

前两天刚接到阿里售前电话 ecs打折99/年 我又入了一年玩玩

1 Like

咦,真好,是2核2G的嘛。我现在有一个香港的服务器,也很香,80¥/年。正向代理一下,弄一个节点出来耍,勉强的可以用,真的香。。。。

1 Like

那,看来是不可能玩高频。。。只适合正常游玩。
不过,两个三个好友一起玩玩养老冒险啥的。应该是没问题的。
哒妹,不:person_gesturing_no:玩高频,再好的机子都遭不住高频滴

事实上树莓派的性能也只能玩普通生存,生物数量还不能太多的那种,不然性能开销太大,带不动的,两三个没问题,我的GTNH服务器有五六人同时玩,但是不能开高频红石,工厂自动化还是勉强,目前是只玩到了中压阶段就快不行了,我这边准备换服务器了

4 Likes

带我一个啊,我也喜欢mc,只是没玩多久,断断续续玩了几个月。
大哥,服务器名称。私me,私me

想问下,开个比较大的整合包,稳定3个人同时在线的话服务器大概要什么配置?

多大,300左右mod嘛。这个我不了解,评论区有大哥就是开服务器的,可以问问他@ 四方霸主