初次接触使用 Docker 和尝试打包 Minecraft 的踩坑记录: Auth Server 的打包

2021-01-25

Blessing Skin (Auth Server) 下载

https://github.com/bs-community/blessing-skin-server/releases

手动安装 Blessing Skin 插件

可以从 https://github.com/bs-community/plugins-dist/tree/master/ 上手动下载插件安装包,下载后将其直接解压到 plugins 目录即可在插件列表中显示,使用 php artisan plugin:enable {plugin-name} 可以启用插件(执行一些启动脚本等)

需要手动启用的两个插件

正版登录 mojang-verification 需要手动启用,因为:

  1. 会绕过禁止注册的限制(会直接用正版账户登录)
  2. 不知道切换 UUID 是否会造成潜在的影响

禁止注册 disable-registration 需要手动启用,因为:

  1. 功能与邀请码注册 invitation-codes 重复

Auth Server 安装后要修改站点地址

auth-server 第一次运行(安装)完成后,需要及时修改站点地址,因为该地址将会被添加到 minecraft 皮肤资源加载白名单(否则皮肤无法显示)。

每次修改完配置都需要重启一下容器,刷新一下缓存

里程碑 - Pull Request Merged

为 bs-community 修复了一个插件 bug !

清除 options.php 缓存以解决插件无法正常启用/禁止

rm -f storage/options.php

Auth Server 备份例外

备份时 upper/storage/framework/ 目录就没有必要包含进去了

Auth Server 打包运行备份命令

使用以下命令打包运行 auth-server ,其中 --cap-add SYS_ADMIN 是因为容器内需要使用 overlayfs,yd 代表 Yggdrasil 。

默认邮箱为 [email protected] ,密码为 password ,昵称为 user ,登录后请及时改名

# 打包
docker build -t wonld-orbis-auth-server .

# 运行(80yd == 8063)(下方部署脚本有自定义网络的案例)
docker run --cap-add SYS_ADMIN -dit -p 8063:80 -v /auth-server-data/data:/data --name yd wonld-orbis-auth-server

# 停止和启动
docker stop yd
docker start yd

# 进入控制台(Ctrl-P Ctrl-Q to detach)
docker attach yd

# 备份
tar \
  --exclude 'data/upper/bootstrap/cache/config.php' \
  --exclude 'data/upper/bootstrap/cache/routes-v7.php' \
  --exclude 'data/upper/storage/framework/views/*' \
  --exclude 'data/upper/storage/framework/sessions/*' \
  --exclude 'data/upper/storage/framework/cache/data/*' \
  --exclude 'data/upper/storage/options.php' \
  -C /auth-server-data \
  -czvf data-backup.tgz .

部署到服务器

# local
docker build -t wonld-orbis-auth-server .
docker save wonld-orbis-auth-server | gzip > image.tgz

# remote
mkdir -p /sharedfolders/A/Docker/wonld-orbis-auth-server
chown -R 1000:1000 /sharedfolders/A/Docker/wonld-orbis-auth-server
pushd /sharedfolders/A/Docker/wonld-orbis-auth-server
# copy local:image.tgz -> remote wonld-orbis-auth-server/
docker load < image.tgz
# networking (29 == wo) .1 被网关使用
docker network create --subnet=192.168.29.0/24 wonld-orbis-net
docker run --cap-add SYS_ADMIN -dit --network wonld-orbis-net --ip 192.168.29.3 -p 8063:80 -v /sharedfolders/A/Docker/wonld-orbis-auth-server/data:/data --name yd wonld-orbis-auth-server

配置

安装完成后,需要手动调整配置:

  • 修改邮箱密码。
  • 修改站点地址为 https://auth.orbis.wonld.com (Yggdrasil 白名单域名)。
  • 修改站点名称 Wonld Orbis (可以同时修改站点描述和站点公告)
  • 设置自己的角色名称

配置完成后,重启容器

关于重启

每次修改完配置,发现各种问题,可以直接重启容器(容器启动脚本自动重新生成本地缓存)

配置阿里云转发

按照之前写的过程安装了 acme.sh 和 nginx 。

申请证书:

CF_1_Zone_Name="wonld.com" CF_1_Zone_ID="id" CF_1_Token="token" /opt/acme.sh/acme.sh --home /opt/acme.sh --issue -d orbis.wonld.com -d '*.orbis.wonld.com' --dns dns_cf

在 nginx 安装后执行:

/opt/acme.sh/acme.sh --home /opt/acme.sh --install-cert -d orbis.wonld.com --key-file /etc/ssl/private/orbis.wonld.com.key --fullchain-file /etc/ssl/certs/orbis.wonld.com.chained.cer --reloadcmd "service nginx force-reload"

编辑 /etc/nginx/sites-available/wonld-orbis-auth

server {
  server_name auth.orbis.wonld.com;

  listen 80;
  listen [::]:80; # Enable IPv6

  listen 443 ssl http2; # Enable HTTP/2
  listen [::]:443 ssl http2;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;
  ssl_prefer_server_ciphers on;

  ssl_session_timeout 1d;
  ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
  ssl_session_tickets off;

  ssl_dhparam /etc/ssl/dhparam.pem;

  include snippets/ssl-params-ocsp.conf; # Enable OCSP Stapling
  include snippets/ssl-params-hsts.conf; # Redirect http to https and set HSTS header
  ssl_certificate /etc/ssl/certs/orbis.wonld.com.chained.cer; # Use normal certificate
  ssl_certificate_key /etc/ssl/private/orbis.wonld.com.key;

  location / {
    proxy_pass http://192.168.3.1:8063/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

启用配置,重启服务:

ln -s /etc/nginx/sites-available/wonld-orbis-auth /etc/nginx/sites-enabled/
systemctl restart nginx

解决 hmcl 启动时提示 malformed response 错误

原因:hmcl 会为端点增加末尾 / ,而 apache 会去掉末尾 / ,而在跳转过程中 apache 并没有考虑代理的请求头,导致协议降级(https -> http),致使 java 抛出错误。

修改 public/.htaccess

+   # Redirect trailing slashes if not a folder (behind a reverse proxy)
+   RewriteCond %{HTTP:X-Forwarded-Proto} ^https$
+   RewriteCond %{REQUEST_FILENAME} !-d
+   RewriteCond %{REQUEST_URI} (.+)/$
+   RewriteRule ^ "%{HTTP:X-Forwarded-Proto}://%{HTTP_HOST}%1" [L,R=301]

    # Redirect trailing slashes if not a folder

以上补丁已经整合到 Dockerfile 中。(20210107 更新:由于切换了版本,该问题已经修复)

解决 Minecraft 在进入服务器时提示 登入失败:身份验证目前正在停机维护

同时 nginx 有错误日志 [crit] SSL_do_handshake() failed (SSL: error:xxxxxxC:SSL routines:tls_early_post_process_client_hello:version too low) while SSL handshaking, client: xxx, server: 0.0.0.0:443

这是由于 Minecraft 所用 tls 版本比较古老所致,需要在 nginx 中使用兼容性较强的配置。

上面的 nginx ssl 参数来自 SSL Configuration Generator | Mozilla 兼容级别为 Old

以上内容已经整合到 nginx 配置中。

20210118 解决无皮肤问题

经测试,用户名带数字,如 lookas2001 无法在原生客户端中被加载出来,其他皮肤正常。

使用 CustomSkinLoader 的客户端可以加载所有皮肤

20210113 尝试使用 fuse-overlayfs 失败

fuse-overlayfs 是一个 overlayfs 在 FUSE 上的移植。

尝试使用“用户空间”文件系统(FUSE)来实现免 SYS_ADMIN 特权运行带有 overlayfs 的 Docker ,以提升隔离性,但是失败。

虽然普通用户使用 FUSE 的时候不需要管理员权限,但是其实质是调用了一个带有 setuid 的管理程序(fuse3),该管理程序与内核交流的时候仍然需要特权。Docker 内的容器要使用 FUSE 的时候需要直接与内核交流,该过程需要 SYS_ADMIN 特权,可以使用 Linux User Namespace (unshare 命令或者使用其他使用了该技术的容器化工具 eg. podman),来创建一个隔离的环境,在该环境中会提供 SYS_ADMIN 特权。但是该技术由于漏洞频发在 Debian 中不是默认启用的,甚至在 wsl2 kernel 中根本连选项都没有。且这种方式需要修改 Docker 对于容器的安全配置文件,故暂时放弃这种方式,待技术成熟以后再使用。

backups

Dockerfile:
apt install fuse3
# copy -> fuse-overlayfs-x86_64 /fuse-overlayfs

/start.sh:
/fuse-overlayfs -o lowerdir=/var/www/html,upperdir=/data/upper,workdir=/data/work /var/www/html

解决会话过期的问题

错误:[Server thread/INFO] [minecraft/NetHandlerLoginServer]: com.mojang.authlib.GameProfile@ffffffff[id=<null>,name=xxxxxxxx,properties={},legacy=false] (/192.168.3.3:999999) lost connection: Disconnected

原因:blessing skin 令牌暂时和永久过期时间不同,导致 hmcl 不对令牌续期,将两值调整至一致即可。

维护网站需要一定的开销,如果您认可这篇文章,烦请关闭广告屏蔽器浏览一下广告,谢谢!
加载中...

(。・∀・)ノ゙嗨,欢迎来到 lookas 的小站!

这里是 lookas 记录一些事情的地方,可能不时会有 lookas 的一些神奇的脑洞或是一些不靠谱的想法。

总之多来看看啦。