HMCL-docs/_modpack/serverpack3.md

10 KiB
Raw Blame History

title date author
Nginx作为静态资源服务器使用HMCL启动器配置服务器客户端自动更新 2023-01-11 14:13:45 +0800 buggzd

阅读本文前,请先阅读此文章

前置知识

阅读本文你需要具有以下知识储备:

  1. 掌握基础本的 linux 命令操作,比如 cd ls
  2. 拥有一个 linux 服务器(好像不算知识)

Nginx 安装

这里很基础(但是坑比较多)略过,可以看以下参考文档。

https://zhuanlan.zhihu.com/p/515069497

新建静态资源文件夹

我为了省事直接在/根目录下新建了一个 MinecraftClientStatic 文件夹,以后需要作为静态资源的文件都丢这里面。

命令:

# 到更目录
cd /
# 新建文件夹
mkdir MinecraftClientStatic
# 防止nginx无法访问配置文件夹访问权限
chmod 777 MinecraftClientStatic
# 进入文件夹
cd MinecraftClientStatic
# 新建一个测试用的文件
touch helloMC.html
# 给文件权限
chmod 777 helloMC.html
# 编辑html内容
vim helloMC.html

这里为了测试静态资源是否配置成功,需要新建一个 helloMC.html 的静态测试文件,可以在这个文件内随意写两行字。

例如:

<!-- helloMC.html -->
<h1>hello static!</h1>

也可以整点炫的(可选)

<!-- helloMC.html -->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>MC客户端静态资源</title>
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
        <style>
            @font-face{
                font-family:'calligraffittiregular';
                src:url("fonts/calligraffitti-regular-webfont.ttf")
            }
            
            * {
                margin: 0;
                padding: 0;
            }
            
            body {
                overflow: hidden;
            }
            
            #content{
                position: absolute;
                color: white;
                top: 30%;
                left: 50%;
                margin-left: -121px;
            }
            
            p{
                font-family: calligraffittiregular
            }
            
        </style>
    </head>

    <body>
        <div id="content">
            <p style="font-size:  40px;font-weight: 1000;">MinecraftClientStatic</p>
        </div>
        <canvas id="hacker" style="width:100%;height:100%;">请使用最新的浏览器</canvas>
    </body>

</html>
<script type="text/javascript">
    window.onload = function() {
        var color_array = ['#00FF00','#00FF99','#00FFCC','#00FFFF','#00BBFF','#0066FF','#0000FF','#5500FF','#7700FF','#9900FF','#CC00FF','#FF00FF'];
        var i=0;
        var color;
        function changColor() {
            color = color_array[i];
            console.log(i++);
            console.log(color);
            if(i>color_array.length-1){
                i=0;
            }
            setTimeout(changColor, 2000);
        }
    
        var hacker = document.getElementById("hacker");
        var width = hacker.width = screen.width;
        var height = hacker.height = screen.height;
        var ctx = hacker.getContext('2d');
        var num = Math.ceil(width / 12);
        var y = Array(num).join(0).split('');
        var draw = function() {
            ctx.fillStyle = 'rgba(0,0,0,.05)';
            ctx.fillRect(0, 0, width, height);
            ctx.fillStyle = color;
            ctx.font = '12px Microsoft YaHei';
            y.map(function(y1,i){
                var text = String.fromCharCode(65 + Math.random() * 62);
                var x = i * 12;  
                var y1 = y[i];
                ctx.fillText(text, x, y1);
                y[i] = ( y1 > Math.random() * 10 * height ? 0 : parseInt(y[i]) + 12 );
            })
        }

        Run();

        function Run() {
            changColor();
            Game_Interval = setInterval(draw, 50);
        }
    }
</script>

分配次级域名(可选)

如果你没有域名那么这里可以跳过后面需要域名的地方直接使用服务器ip地址

假设我们的域名是 buggzd.com

在域名解析新建一个 A 记录(地址为 ipv6 时应使用 AAAA 记录),此处以 minecraft.buggzd.com 为例,配置记录名称为 minecraft 配置记录地址为服务器地址,如下图所示。

image.png

这是我们就有了一个子域名 minecraft.buggzd.com 添加完成后可以使用 cmdping 一下这个域名minecraft.buggzd.com 如果返回了正确的ip地址就是已经分配成功了。

ping minecraft.buggzd.com

配置 nginx.conf

查找 nginx 配置文件目录:(如果这里没有 nginx 指令,那么说明你 nginx 安装没有成功)

nginx -t

输出

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

这里 /etc/nginx/nginx.conf 就是 Nginx 配置文件的路径,然后 cdnginx 配置目录。

cd /etc/nginx
# 编写配置文件
vim nginx.conf

因为之前配置过博客反向代理 nginx.conf 会带有之前的配置记录不要把他们搞乱,理清层级关系很重要

# 这是 nginx.conf 的层级目录
# 每个 nginx.conf 配置文件都只有一个 http 块,所以如果之前配置过 nginx
# 就只需要粘贴 server 块里的内容,把 server 块放到 http 块内部。
http {
    server { ... }
    server { ... }
    server { ... }
}

需要填写的配置:

http {
    server {
        # 需要监听的端口号,可以不动
        listen 80;       
        # 这里需要把localhost改为上面分配好的域名
        server_name  minecraft.buggzd.com;
        location / {
            # root后面是对应的静态资源文件夹的位置
            root /MinecraftClientStatic;
            # 这里是默认加载的首页 html ,这里放的是刚刚新建的测试文件
            # 它是从 root 目录文件夹内开始查找的,所以不要写 /MinecraftClientStatic/helloMC.html
            index helloMC.html;
        }
    }
}

Q:上面的配置干了什么事?
A:比如你访问 http://minecraft.buggzd.com/test.png 时,nginx 会访问本地的 /MinecraftClientStatic/test.png 然后返回。

当正确编写完 nginx.conf 需要让 nginx 重新加载一下配置文件。

nginx -s reload

然后直接访问刚刚配置的域名 minecraft.buggzd.com 默认会跳转到编写好的 helloMC.html 页面,你也可以访问 http://minecraft.buggzd.com/helloMC.html

image.png

当页面出现 helloMC.html 的内容时,说明已经配置成功了! 放张图片到静态资源文件夹试试。

image.png

访问成功,没问题!

导出整合包

image.png

选择服务器自动更新整合包

image.png

整合包下载链接前缀:填静态资源服务器的地址。 我们需要先去静态资源文件夹下新建一个 modepack 文件夹(也就是 /MinecraftClientStatic/modepack

cd /MinecraftClientStatic
mkdir modepack

然后整合包下载链接前缀这里填写 http://minecraft.buggzd.com/modepack

image.png

上传整合包到静态资源服务器

假设我们刚刚打包的整合包名称为 client1.0.zip 我们把 client1.0.zip 通过 ftp 上传到服务器中,然后使用解压命令将这个整合包解压到 /MinecraftClientStatic/modepack 文件夹中。

# 假设我们把client1.0.zip上传到了/home/ftp文件夹中
# 把 /home/ftp/client1.0.zip 解压到 /minecraftClientStatic/modepack
unzip /home/ftp/client1.0.zip -d /minecraftClientStatic/modepack

解压完以后我们查看一下

ls /minecraftClientStatic/modepack

服务器返回:

overrides server-manifest.json

其中 overrides 是一个文件夹 server-manifest.json 是整合包配置文件。

客户端初始化

第一次使用客户端需要在一个空文件夹以 newClientPackage 为例,在文件夹中放一个 hmcl 启动器,打开 hmcl 导入刚刚做好的 client1.0.zip 整合包。 然后就可以把这个文件夹 newClientPackage 打包成一个 zip 发给玩家了,以后玩家每次打开 hmcl 登录时,启动器就会自动向静态资源服务器中查询整合包配置信息,当发现更新时会自动下载。 当缺少 mod 时会自动下载静态资源服务器上的 mod

image.png

更新客户端

目前HMCL版本更新的步骤是这样的

  1. 启动器对比本地的 mod 和服务器的 mod 名称,如发现本地不存在的 mod 则会从服务器上下载。
  2. mod 的名称相同时,启动器会继续对比文件 MD5 哈希值,如果不匹配则重新下载。
  3. 在获得更新的时启动器会对比一次本地的文件,如果旧版本的模组在新版本中消失了,启动器会自动将本地的这个模组删除。
  4. 非远端服务器更新资源不会被更新删除,换句话说就是如果是玩家自己魔改整合包,往里面放的 mod 是不会被删除的。

当想要添加新的 mod 时需要在添加之后重新导出整合包如 client2.0.zip 导出的整合包版本号增加,然后重新上传整合包到静态资源服务器。

cd /minecraftClientStatic
# 建议直接删除该目录然后重新新建
rm modepack -R
# 重新新建modepack文件夹
mkdir modepack
# 解压新的客户端整合包
unzip /home/ftp/client2.0.zip -d /minecraftClientStatic/modepack

玩家启动 hmcl 后,启动器会检测到版本更新并自动更新模组。

参考资料