初次接触使用 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 需要手动启用,因为:
- 会绕过禁止注册的限制(会直接用正版账户登录)
- 不知道切换 UUID 是否会造成潜在的影响
禁止注册 disable-registration 需要手动启用,因为:
- 功能与邀请码注册 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 更新:由于切换了版本,该问题已经修复)
- https://github.com/bs-community/blessing-skin-server/pull/208
- Apache Module mod_rewrite Doc
- Force HTTPS with mod_rewrite, including proxied SSL
解决 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 对于容器的安全配置文件,故暂时放弃这种方式,待技术成熟以后再使用。
- Allow FUSE functionality by default · Issue #321 · docker/for-linux
- Best practices for running Buildah in a container - Red Hat Developer
- GitHub - containers/fuse-overlayfs: FUSE implementation for overlayfs
- kmxz/overlayfs-tools: Maintenance tools for overlay-filesystem
- linux - What does enabling kernel.unprivileged_userns_clone do? - Information Security Stack Exchange
- Linux Namespace : User - sparkdev - 博客园
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 不对令牌续期,将两值调整至一致即可。