/palworld-server-tool

基于Level.sav存档解析和RCON优雅地用可视化界面管理幻兽帕鲁专用服务器。/ Through parse Level.sav and RCON, visual interface management PalWorld dedicated server.

Primary LanguageGoApache License 2.0Apache-2.0

幻兽帕鲁服务器管理工具

简体中文 | English | 日本語

通过可视化界面及 REST 接口管理幻兽帕鲁专用服务器,基于 SAV 存档文件解析及 REST&RCON 实现
并且花了很漫长且枯燥的时间去做了国际化...

GitHub Repo stars   Go   Python   Vue

PC

目前移动端适配良好,可查看下面 功能截图

当然深色模式也安排得妥妥的~

基于 Level.sav 存档文件解析实现的功能:

  • 完整玩家数据
  • 玩家帕鲁数据
  • 公会数据
  • 玩家背包物品数据

基于官方提供的 REST API 实现功能:

  • 获取服务器信息
  • 获取服务器指标数据
  • 在线玩家列表
  • 踢出/封禁玩家
  • 游戏内广播
  • 平滑关闭服务器并广播消息

工具额外提供的功能:

  • 白名单管理
  • 自定义 RCON 命令并执行
  • 存档自动备份与管理

本工具使用 bbolt 单文件存储,将 RCON 和 Level.sav 文件的数据通过定时任务获取并保存,提供简单的可视化界面和 REST 接口和便于管理与开发。

由于维护开发人员较少,虽有心但力不足,欢迎各前端和后端甚至数据工程师来提交 PR!

Note

如果您需要幻兽帕鲁服务器&工具搭建交流,或者需要闭源付费定制功能开发,如:多服务器管理、服务器注入反作弊、可视化修改存档等,请加群或 QQ 交流

幻兽帕鲁服务器管理交流:幻兽帕鲁服务器管理

加QQ群

功能截图

pst-zh-v.mp4

桌面端

移动端

开启 REST API 与 RCON

本项目必需开启服务器的 REST API 功能才能正常使用,而自定义 RCON 功能则依赖于 RCON 功能。

如果你的私服教程有写更好,没有的话,请先关闭服务端,然后在 Pal-Conf 修改 PalWorldSettings.ini 文件或者 WorldOption.sav 文件并放到相应位置,启用服务端。

先设置 管理员密码

ADMIN

再设置 RCONREST API

RCON_REST

安装部署

解析 Level.sav 存档的任务需要在短时间(<20s)耗费一定的系统内存(1GB~3GB),这部分内存会在执行完解析任务后释放,因此你至少需要确保你的服务器有充足的内存。

这里默认为将 pst 工具和游戏服务器放在同一台物理机上,在一些情况下你可能不想要它们部署在同一机器上:

  • 需要单独部署在其它服务器
  • 只需要部署在本地个人电脑
  • 游戏服务器性能较弱不满足,采用上述两种方案之一

请参考 pst-agent 部署教程从 k8s-pod 同步存档

Sealos 一键部署

30s 部署私服 + 管理工具,拒绝复杂步骤

首先点击以下按钮一键部署帕鲁私服:

然后点击以下按钮一键部署 palworld-server-tool:

文件部署

请在以下地址下载最新版可执行文件

Linux

下载解压
# 下载 pst_{version}_{platform}_{arch}.tar.gz 文件并解压到 pst 目录
mkdir -p pst && tar -xzf pst_v0.7.1_linux_x86_64.tar.gz -C pst
配置
  1. 打开目录并允许可执行

    cd pst
    chmod +x pst sav_cli
  2. 找到其中的 config.yaml 文件并按照说明修改。

    关于其中的 decode_path,一般就是解压后的 pst 目录加上 sav_cli ,可以为空,默认会获取当前目录

    # WebUI 设置
    web:
      # WebUI 管理员密码
      password: ""
      # WebUI 访问端口
      port: 8080
      # 是否开启使用 HTTPS TLS 访问
      tls: false
      # TLS Cert 如果开启使用 HTTPS 请输入证书文件路径
      cert_path: ""
      # TLS Key 如果开启使用 HTTPS 请输入证书密钥文件路径
      key_path: ""
      # 若开启 HTTPS 访问请填写你的 HTTPS 证书绑定的域名 eg. https://yourdomain.com
      public_url: ""
    
    # 任务相关设置
    task:
      # 定时向游戏服务获取玩家在线情况的间隔,单位秒
      sync_interval: 60
      # 玩家进入/离开服务器通知
      player_logging: true
      # 玩家进入服务器消息
      player_login_message: "玩家 {username} 加入服务器!\n当前在线人数: {online_num}"
      # 玩家离开服务器消息
      player_logout_message: "玩家 {username} 离开服务器!\n当前在线人数: {online_num}"
    
    # RCON 相关设置
    rcon:
      # RCON 的地址和端口
      address: "127.0.0.1:25575"
      # 服务端设置的 AdminPassword
      password: ""
      # 服务器是否已开启 PalGuard 功能插件的 Base64 RCON 功能(需自行安装)
      use_base64: false
      # RCON 通信超时时间,推荐 <= 5
      timeout: 5
    
    # REST API 相关配置
    rest:
      # REST 的地址
      address: "http://127.0.0.1:8212"
      # Base Auth 的用户名,固定为 admin
      username: "admin"
      # 服务端设置的 AdminPassword
      password: ""
      # 通信超时时间,推荐 <= 5
      timeout: 5
    
    # sav_cli Config 存档文件解析相关配置
    save:
      # 存档文件路径
      path: "/path/to/your/Pal/Saved"
      # 存档解析工具路径,一般和 pst 在同一目录,可以为空
      decode_path: ""
      # 定时从存档获取数据的间隔,单位秒,推荐 >= 120
      sync_interval: 120
      # 存档定时备份间隔,单位秒,设置为0时禁用
      backup_interval: 14400
    
    # Automation Config 自动化管理相关
    manage:
      # 玩家不在白名单是否自动踢出
      kick_non_whitelist: false
运行
./pst
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:75 | Starting PalWorld Server Tool...
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:76 | Version: Develop
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:77 | Listening on http://127.0.0.1:8080 or http://192.168.1.66:8080
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:78 | Swagger on http://127.0.0.1:8080/swagger/index.html

若需要后台运行(关闭 ssh 窗口后仍运行)

# 后台运行并将日志保存在 server.log
nohup ./pst > server.log 2>&1 &
# 查看日志
tail -f server.log
关闭后台运行
kill $(ps aux | grep 'pst' | awk '{print $2}') | head -n 1
访问

请通过浏览器访问 http://127.0.0.1:8080 或 http://{局域网 IP}:8080

云服务器开放防火墙及安全组后也可以访问 http://{服务器 IP}:8080

Warning

初次打开会显示空白没有内容,请等待第一次 sav 存档同步完成再访问

如果你的服务器配置足够且性能良好,你可以试着将 save.sync_interval 改短一点

Windows

下载解压

解压 pst_v0.7.1_windows_x86_64.zip 到任意目录(推荐命名文件夹目录名称为 pst

配置

找到解压目录中的 config.yaml 文件并按照说明修改。

关于其中的 decode_path,一般就是解压后的 pst 目录加上 sav_cli.exe,可以为空,默认会获取当前目录

你也可以直接鼠标右键——“属性”,查看路径和文件名,再将它们拼接起来。(存档文件路径和工具路径同理)

Warning

请不要直接将复制的路径粘贴到 config.yaml 中,而是需要在所有的 '\' 前面再加一个 '\',像下面展示的一样

还有比较重要的是,请确保 config.yaml 文件为 ANSI 编码,其它编码格式将会导致路径错误等问题!!

# WebUI 设置
web:
  # WebUI 管理员密码
  password: ""
  # WebUI 访问端口
  port: 8080
  # 是否开启使用 HTTPS TLS 访问
  tls: false
  # TLS Cert 如果开启使用 HTTPS 请输入证书文件路径
  cert_path: ""
  # TLS Key 如果开启使用 HTTPS 请输入证书密钥文件路径
  key_path: ""
  # 若开启 HTTPS 访问请填写你的 HTTPS 证书绑定的域名 eg. https://yourdomain.com
  public_url: ""

# 任务相关设置
task:
  # 定时向游戏服务获取玩家在线情况的间隔,单位秒
  sync_interval: 60
  # 玩家进入/离开服务器通知
  player_logging: true
  # 玩家进入服务器消息
  player_login_message: "玩家 {username} 加入服务器!\n当前在线人数: {online_num}"
  # 玩家离开服务器消息
  player_logout_message: "玩家 {username} 离开服务器!\n当前在线人数: {online_num}"

# RCON 相关设置
rcon:
  # RCON 的地址和端口
  address: "127.0.0.1:25575"
  # 服务端设置的 RCON AdminPassword
  password: ""
  # 服务器是否已使用 PalGuard 功能插件的 Base64 RCON 功能(需自行安装)
  use_base64: false
  # RCON 通信超时时间,推荐 <= 5
  timeout: 5

# REST API 相关配置
rest:
  # REST 的地址
  address: "http://127.0.0.1:8212"
  # Base Auth 的用户名,固定为 admin
  username: "admin"
  # 服务端设置的 AdminPassword
  password: ""
  # 通信超时时间,推荐 <= 5
  timeout: 5

# sav_cli Config 存档文件解析相关配置
save:
  # 存档文件路径
  path: "C:\\path\\to\\your\\Pal\\Saved"
  # 存档解析工具路径,一般和 pst 在同一目录,可以为空
  decode_path: ""
  # 定时从存档获取数据的间隔,单位秒,推荐 >= 120
  sync_interval: 120
  # 存档定时备份间隔,单位秒,设置为0时禁用
  backup_interval: 14400

# Automation Config 自动化管理相关
manage:
  # 玩家不在白名单是否自动踢出
  kick_non_whitelist: false
运行

这里有两种方式可以在 Windows 下运行

  1. start.bat(推荐)

    找到解压目录下的 start.bat 文件,双击运行

  2. 按下 Win + R,输入 powershell 打开 Powershell,通过 cd 命令到下载的可执行文件目录

    .\pst.exe
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:75 | Starting PalWorld Server Tool...
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:76 | Version: Develop
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:77 | Listening on http://127.0.0.1:8080 or http://192.168.31.214:8080
2024/01/31 - 22:39:20 | INFO | palworld-server-tool/main.go:78 | Swagger on http://127.0.0.1:8080/swagger/index.html

看到上述界面表示成功运行,请保持窗口打开

访问

请通过浏览器访问 http://127.0.0.1:8080 或 http://{局域网 IP}:8080

云服务器开放防火墙及安全组后也可以访问 http://{服务器 IP}:8080

Warning

初次打开会显示空白没有内容,请等待第一次 sav 存档同步完成再访问

如果你的服务器配置足够且性能良好,你可以试着将 save.sync_interval 改短一点

Docker 部署

单体部署

只需要一个容器,将游戏存档目录映射至容器内,与游戏服务器在同一物理主机上运行。

docker run -d --name pst \
-p 8080:8080 \
-v /path/to/your/Pal/Saved:/game \
-v ./backups:/app/backups \
-e WEB__PASSWORD="your web password" \
-e RCON__ADDRESS="172.17.0.1:25575" \
-e RCON__PASSWORD="your admin password" \
-e REST__ADDRESS="http://127.0.0.1:8212" \
-e REST__PASSWORD="your admin password" \
-e SAVE__PATH="/game" \
-e SAVE__SYNC_INTERVAL=120 \
jokerwho/palworld-server-tool:latest

最重要的是需要 -v 到游戏存档文件(Level.sav)所在目录,将其映射到容器内的 /game 目录

持久化

如果需要持久化 pst.db 文件:

# 先创建文件,避免被识别为目录
touch pst.db

然后在 docker run -v 中增加 -v ./pst.db:/app/pst.db

环境变量

设置各环境变量,与 config.yaml 基本相似,表格如下:

Warning

注意区分单个和多个下划线,若需修改最好请复制下表变量名!

变量名 默认值 类型 说明
WEB__PASSWORD "" 文本 Web 界面的管理员模式密码
WEB__PORT 8080 数字 若非必要不建议修改,而是更改容器映射端口
RCON__ADDRESS "127.0.0.1:25575" 文本 RCON 服务对应的地址,可以用容器网络 172.17.0.1:25575
RCON__PASSWORD "" 文本 服务器配置文件中的 AdminPassword
RCON__USE_BASE64 false 布尔 服务器是否开启 PalGuard 功能插件的 Base64 RCON 功能
RCON__TIMEOUT 5 数字 单个请求 RCON 服务的超时时间
TASK__SYNC_INTERVAL 60 数字 请求服务器同步玩家在线数据的间隔
TASK__PLAYER_LOGGING false 布尔 玩家登录/登出广播消息
TASK__PLAYER_LOGIN_MESSAGE "" 文本 玩家登录广播消息内容
TASK__PLAYER_LOGOUT_MESSAGE "" 文本 玩家登出广播消息内容
REST__ADDRESS "http://127.0.0.1:8212" 文本 服务 REST API 对应的地址,可以用容器网络
REST__PASSWORD "" 文本 服务器配置文件中的 AdminPassword
REST__TIMEOUT 5 数字 单个请求的超时时间
SAVE__PATH "" 文本 游戏存档所在路径 请务必填写为容器内的路径
SAVE__DECODE_PATH "/app/sav_cli" 文本 ⚠️ 容器内置,禁止修改,会导致存档解析工具错误
SAVE__SYNC_INTERVAL 600 数字 同步玩家存档数据的间隔
SAVE__BACKUP_INTERVAL 14400 数字 自动备份玩家存档数据的间隔
MANAGE__KICK_NON_WHITELIST false 布尔 当检测到玩家不在白名单却在线时自动踢出

Agent 部署

需要两个容器,分别是 palworld-server-toolpalworld-server-tool-agent

适用于:

  • 需要单独部署在其它服务器
  • 只需要部署在本地个人电脑
  • 游戏服务器性能较弱不满足,采用上述两种方案之一
先运行 agent 容器

注意:使用交换分区,可能导致程序性能下降,建议仅在内存不足时使用

docker run -d --name pst-agent \
-p 8081:8081 \
-v /path/to/your/Pal/Saved:/game \
-e SAVED_DIR="/game" \
jokerwho/palworld-server-tool-agent:latest

需要 -v 到游戏存档文件(Level.sav)所在目录,将其映射到容器内的 /game 目录

变量名 默认值 类型 说明
SAVED_DIR "" 文本 游戏存档 Saved 目录所在路径 请务必填写为容器内的路径
再运行 pst 容器
docker run -d --name pst \
-p 8080:8080 \
-v ./backups:/app/backups \
-e WEB__PASSWORD="your password" \
-e RCON__ADDRESS="游戏服务器IP:25575" \
-e RCON__PASSWORD="your admin password" \
-e REST__ADDRESS="http://游戏服务器IP:8212" \
-e REST__PASSWORD="your admin password" \
-e SAVE__PATH="http://游戏服务器IP:Agent端口/sync" \
-e SAVE__SYNC_INTERVAL=120 \
jokerwho/palworld-server-tool:latest
持久化

如果需要持久化 pst.db 文件:

# 先创建文件,避免被识别为目录
touch pst.db

然后在 docker run -v 中增加 -v ./pst.db:/app/pst.db

环境变量

Warning

注意区分单个和多个下划线,若需修改最好请复制下表变量名!

变量名 默认值 类型 说明
WEB__PASSWORD "" 文本 Web 界面的管理员模式密码
WEB__PORT 8080 数字 若非必要不建议修改,而是更改容器映射端口
RCON__ADDRESS "127.0.0.1:25575" 文本 RCON 服务对应的地址,一般为游戏服务器 IP:25575
RCON__PASSWORD "" 文本 服务器配置文件中的 AdminPassword
RCON__USE_BASE64 false 布尔 服务器是否开启 PalGuard 功能插件的 Base64 RCON 功能
RCON__TIMEOUT 5 数字 单个请求 RCON 服务的超时时间
TASK__SYNC_INTERVAL 60 数字 请求服务器同步玩家在线数据的间隔
TASK__PLAYER_LOGGING false 布尔 玩家登录/登出广播消息
TASK__PLAYER_LOGIN_MESSAGE "" 文本 玩家登录广播消息内容
TASK__PLAYER_LOGOUT_MESSAGE "" 文本 玩家登出广播消息内容
REST__ADDRESS "http://127.0.0.1:8212" 文本 服务 REST API 对应的地址,可以用容器网络
REST__PASSWORD "" 文本 服务器配置文件中的 AdminPassword
REST__TIMEOUT 5 数字 单个请求的超时时间
SAVE__PATH "" 文本 pst-agent 所在服务地址,格式为
http://{游戏服务器 IP}:{Agent 端口}/sync
SAVE__DECODE_PATH "/app/sav_cli" 文本 ⚠️ 容器内置,禁止修改,会导致存档解析工具错误
SAVE__SYNC_INTERVAL 600 数字 同步玩家存档数据的间隔
SAVE__BACKUP_INTERVAL 14400 数字 自动备份玩家存档数据的间隔
MANAGE__KICK_NON_WHITELIST false 布尔 当检测到玩家不在白名单却在线时自动踢出

从 k8s-pod 同步存档

从 v0.5.3 开始,支持无需 agent 同步集群内游戏服务器存档。

v0.5.8 之后,由于增加了玩家背包数据查看,复制的是整个 Sav 文件的目录,须确保帕鲁服务端容器内具有 tar 工具才能压缩和解压

请确保 pst 所使用的 serviceaccount 具有 "pods/exec" 权限!

只需要更改 SAVE__PATH 环境变量即可,格式如下:

SAVE__PATH="k8s://<namespace>/<podname>/<container>:<游戏存档目录>"

比如:

SAVE__PATH="k8s://default/palworld-server-0/palworld-server:/palworld/Pal/Saved

由于游戏服务器创建 Level.sav 文件的时间、位置(包含 HASH)在初次都不确定,您只需要指向 Saved 目录级别即可,程序会自动扫描

当 pst 与游戏服务器在同一 namespace 下时,您可以省略它:

SAVE__PATH="k8s://palworld-server-0/palworld-server:/palworld/Pal/Saved

从 docker 容器同步存档

从 v0.5.3 开始,支持无需 agent 同步容器内游戏服务器存档

文件部署使用

当你的 pst 本体是通过运行二进制文件部署时,只需要修改 config.yaml 中的 save.path 即可:

save:
  path: "docker://<container_name_or_id>:<游戏存档目录>"

比如:

save:
  path: docker://palworld-server:/palworld/Pal/Saved
# or
save:
  path: docker://04b0a9af4288:/palworld/Pal/Saved

Docker 部署使用

如果 pst 本体是通过 Docker 单体部署的,那么你需要修改 SAVE__PATH 环境变量,并且将 Docker 守护进程挂载至 pst 容器内

  1. 挂载守护进程

在原来的 docker run 命令中,增加一行 -v /var/run/docker.sock:/var/run/docker.sock

  1. 修改环境变量

更改 SAVE__PATH 环境变量,格式如下:

SAVE__PATH="docker://<container_name_or_id>:<游戏存档目录>"

比如:

SAVE__PATH="docker://palworld-server:/palworld/Pal/Saved"
#or
SAVE__PATH="docker://04b0a9af4288:/palworld/Pal/Saved"

Warning

如果在运行后看到如 Error response from daemon: client version 1.44 is too new. Maximum supported API version is 1.43 的报错,是因为你当前 docker engine 使用的 Docker API 版本较低,这时候请再增加一个环境变量:

-e DOCKER_API_VERSION="1.43" (你的 API 版本)

由于游戏服务器创建 Level.sav 文件的时间、位置(包含 HASH)在初次都不确定,您只需要指向 Saved 目录级别即可,程序会自动扫描

接口文档

APIFox 在线接口文档

感谢

许可证

根据 Apache2.0 许可证 授权,任何转载请在 README 和文件部分标明!任何商用行为请务必告知!