使用 Docker 轻松管理 Palworld 服务端
前言
最近我制作了 Palworld 的 Docker 镜像,非专业用户仅需具备最基本的 Docker 安装经验即可轻松部署 Palworld 服务端。
前提
您的系统环境需安装 Docker 以及 Docker Compose。某些情况下你的服务器可能会不支持 Docker:
- 虚拟化类型。云服务器普遍基于虚拟化技术,说直白点就是虚拟机。某些虚拟化技术不支持 Docker,例如 OpenVZ 虚拟化出来的“容器”。虽然 OpenVZ 7 已经支持 Docker 了,但少部分不支持 Docker 的 OVZ 服务器仍然存在。
- 系统问题。因为某些原因,中文 Linux 运维生态有自己的“特色”,例如他们普遍崇尚用旧版本的 CentOS 作为服务器系统。在某些太旧的 CentOS 上 Docker 也不能很好的运行。
所以:如果你的服务器是 OVZ 容器并尝试运行 Docker 失败,请更换服务商产品类型(选择基于 Xen/KVM 的虚拟机)。如果你使用的是 CentOS,请直接重装为 Debian (12) 或 Ubuntu (22.04)。
如果你使用的是软路由,某些基于 OpenWrt 的国产固件也不能很好的运行 Docker。
过程
创建一个 palworld-server
文件夹,我们以此文件夹为工作目录进行后续操作。
dockerapps
目录,然后在里边创建 palworld-server
,即 dockerapps/palworld-server
。在 palworld-server
文件夹下创建 docker-compose.yml
文件,内容如下:
version: "3"
services:
main:
image: hentioe/steamcmd:palworld-server
ports:
- "8211:8211/udp"
command:
- "EpicApp=PalServer"
volumes:
- ./steamapps:/home/steamcmd/steamapps
restart: always
手动创建 steamapps
文件夹:mkdir -m 777 steamapps
。运行命令 docker compose up -d
启动容器。
docker-compose.yml
中的配置,我们将当前路径下的 steamapps
目录挂载到容器中。其实我们通常不用手动创建这类挂载到容器中的目录,但为了避免权限问题我们需要这样做(因为容器中启动的进程以 1000
作为 UID 运行)。大功告成!
检查状态
容器启动后,首先会安装 Palworld 服务端。安装完成后自动启动。在启动前还会复制默认的配置文件。
运行 docker compose logs
命令查看容器的输出日志,可以查看启动进度。正常来讲你在最上面会看到 Steam 的一些输出,如:
palworld-server-main-1 | tid(11) burning pthread_key_t == 0 so we never use it
palworld-server-main-1 | Redirecting stderr to '/home/steamcmd/Steam/logs/stderr.txt'
palworld-server-main-1 | Logging directory: '/home/steamcmd/Steam/logs'
palworld-server-main-1 | [ 0%] Checking for available updates...
palworld-server-main-1 | [----] Verifying installation...
palworld-server-main-1 | [ 0%] Downloading update...
palworld-server-main-1 | [ 0%] Checking for available updates...
palworld-server-main-1 | [----] Download complete.
palworld-server-main-1 | [----] Extracting package...
palworld-server-main-1 | [----] Extracting package...
palworld-server-main-1 | [----] Extracting package...
palworld-server-main-1 | [----] Extracting package...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Installing update...
palworld-server-main-1 | [----] Cleaning up...
palworld-server-main-1 | [----] Update complete, launching Steamcmd...
palworld-server-main-1 | tid(23) burning pthread_key_t == 0 so we never use it
palworld-server-main-1 | Redirecting stderr to '/home/steamcmd/Steam/logs/stderr.txt'
palworld-server-main-1 | Logging directory: '/home/steamcmd/Steam/logs'
palworld-server-main-1 | [ 0%] Checking for available updates...
palworld-server-main-1 | [----] Verifying installation...
palworld-server-main-1 | Steam Console Client (c) Valve Corporation - version 1705108307
palworld-server-main-1 | -- type 'quit' to exit --
palworld-server-main-1 | Loading Steam API...OK
palworld-server-main-1 |
palworld-server-main-1 | Connecting anonymously to Steam Public...OK
palworld-server-main-1 | Waiting for client config...OK
在 Waiting for client config...OK
这个输出后,可能要等待好一会儿。一般一两分钟后会看到后续输出:
palworld-server-main-1 | Waiting for user info...OK
palworld-server-main-1 | Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
palworld-server-main-1 | Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
palworld-server-main-1 | Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
palworld-server-main-1 | Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
palworld-server-main-1 | Update state (0x61) downloading, progress: 0.00 (0 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 0.19 (4194304 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 0.93 (20971520 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 3.24 (72732716 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 6.71 (150830167 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 13.77 (309573239 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 21.25 (477638978 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 24.02 (539935014 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 26.93 (605506161 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 28.68 (644696624 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 31.65 (711422364 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 33.84 (760847427 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 35.99 (809017884 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 38.38 (862810541 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 40.42 (908686112 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 42.76 (961196474 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 45.18 (1015660061 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 48.07 (1080527900 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 50.38 (1132560383 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 52.67 (1184074647 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 55.14 (1239604776 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 57.47 (1292033087 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 60.06 (1350277825 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 63.14 (1419407318 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 66.18 (1487800135 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 69.54 (1563397184 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 72.37 (1626971781 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 74.88 (1683358670 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 78.69 (1769041757 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 82.64 (1857701663 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 86.63 (1947489175 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 89.22 (2005709782 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 92.25 (2073765257 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 95.43 (2145303639 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 98.01 (2203280809 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 98.56 (2215766741 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 98.75 (2219961045 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 98.98 (2225203925 / 2248045559)
palworld-server-main-1 | Update state (0x61) downloading, progress: 99.57 (2238282023 / 2248045559)
palworld-server-main-1 | Update state (0x81) verifying update, progress: 28.13 (632458456 / 2248045559)
palworld-server-main-1 | Success! App '2394010' fully installed.
这里的 Success! App '2394010' fully installed.
表示安装 Palworld 服务端成功。还可以发现 Steam 在下载 Palworld 服务端时,会输出百分比进度。因为可靠的 CDN,通常速度非常快。
然后是 Palworld 启动的输出:
palworld-server-main-1 | Copying default config file...
palworld-server-main-1 | dlopen failed trying to load:
palworld-server-main-1 | steamclient.so
palworld-server-main-1 | with error:
palworld-server-main-1 | steamclient.so: cannot open shared object file: No such file or directory
palworld-server-main-1 | Shutdown handler: initalize.
palworld-server-main-1 | [S_API] SteamAPI_Init(): Loaded '/home/steamcmd/.local/share/Steam/steamcmd/linux64/steamclient.so' OK. (First tried local 'steamclient.so')
palworld-server-main-1 | - Existing per-process limit (soft=1073741816, hard=1073741816) is enough for us (need only 1073741816)
palworld-server-main-1 | Increasing per-process limit of core file size to infinity.
palworld-server-main-1 | - Existing per-process limit (soft=18446744073709551615, hard=18446744073709551615) is enough for us (need only 18446744073709551615)
palworld-server-main-1 | CAppInfoCacheReadFromDiskThread took 2 milliseconds to initialize
palworld-server-main-1 | Setting breakpad minidump AppID = 2394010
palworld-server-main-1 | [S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
palworld-server-main-1 | [S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
palworld-server-main-1 | [S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
palworld-server-main-1 | [S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.
看到 [S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.
即表示启动成功。
修改配置
文件 steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
是我们的服务端世界配置。我的镜像在启动时,会自动检测配置是否存在或者是否为空,如果是则会复制一份默认配置过来。所以这个文件是有值的,所有配置项全是默认值。
默认配置内容如下:
; This configuration file is a sample of the default server settings.
; Changes to this file will NOT be reflected on the server.
; To change the server settings, modify Pal/Saved/Config/LinuxServer/PalWorldSettings.ini.
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="Default Palworld Server",ServerDescription="",AdminPassword="",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=False,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")
steamapps/common/PalServer/DefaultPalWorldSettings.ini
。而我为大家生成的世界配置的内容就来源于此,否则它是空的。一些修改示例:
ServerName
的值设置为Dockerized Palworld Server
,会看到世界的名称变了。ServerPassword
的值设置为一个密码,会发现进入服务器需要密码了。DeathPenalty
的值设置为None
,会发现死亡不会掉落物品了。
执行重启容器的命令 docker compose restart
让修改生效。
恢复默认配置
删除 steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
文件,重启容器即可。
升级版本
容器在启动时,会始终安装最新的 Palworld 服务端。有新版本发布后,重启容器便会发生重新安装并缓存最新版的现象。所以,重启即是升级。
当然,如果镜像本身发生了更新,你还是要执行 docker compose pull
拉取最新版镜像的。它可能跟游戏版本无关,但多了一些增强和修复。因为 steamapps
被缓存在宿主机目录了,所以更新甚至重建容器都不会出现重复安装或数据丢失。
结束语
此镜像是开源的,关联的仓库源码在 Hentioe/docker-steamcmd
。祝大家游戏愉快。
订阅频道第一时间掌握作者博客的最新动态,获取更多的分享。