幻兽帕鲁本地服务器外网联机最佳解决方案docker+frp

1.安装docker engine

非ubuntu其他系统安装docker官方手册

  • 前置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加Docker官方GPG密钥:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 添加apt仓库源:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

  • 开始安装
1
2
3
# 安装
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

  • 添加国内镜像仓库
1
sudo vim /etc/docker/daemon.json
1
2
3
4
5
6
7
8
9
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com"
]
}
1
2
3
4
5
6
# 重启docker使配置生效
$ systemctl restart docker
# 查看配置
$ docker info
# 拉取运行测试
$ sudo docker run hello-world

2.安装PalServer-Docker服务器

jammsen/palworld-dedicated-server 镜像HUB地址

1
2
3
4
5
# 拉取镜像
$ sudo docker pull jammsen/palworld-dedicated-server:latest
# 创建一个具有权限的文件夹,用于映射下载的palworld服务器文件
$ mkdir ~/palworld
$ sudo chmod 777 ~/palworld
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动容器实例
$ sudo docker run -d --name palworld-dedicated-server \
-p 8211:8211/udp -p 25575:25575/tcp \
-e ALWAYS_UPDATE_ON_START=true \
-e MAX_PLAYERS=32 \
-e MULTITHREAD_ENABLED=true \
-e COMMUNITY_SERVER=true \
-e RCON_ENABLED=true \
-e RCON_PORT=25575 \
-e PUBLIC_IP="" \
-e PUBLIC_PORT=8211 \
-e SERVER_NAME=DockerPalWorld \
-e SERVER_DESCRIPTION="" \
-e SERVER_PASSWORD="" \
-e ADMIN_PASSWORD="" \
-v ~/palworld:/palworld \
jammsen/palworld-dedicated-server:latest
  • 可以使用ctrl + p + q 退出docker交互
  • 可使用docker-compose构建
  • compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '3.9'
services:
palworld-dedicated-server:
build: .
container_name: palworld-dedicated-server
image: jammsen/palworld-dedicated-server:latest
restart: always
network_mode: bridge
ports:
- target: 8211 # gamerserver port inside of the container
published: 8211 # gamerserver port on your host
protocol: udp
mode: host
- target: 25575 # rcon port inside of the container
published: 25575 # rcon port on your host
protocol: tcp
mode: host
environment:
- ALWAYS_UPDATE_ON_START=true
- MAX_PLAYERS=32
- MULTITHREAD_ENABLED=true
- COMMUNITY_SERVER=true
- RCON_ENABLED=true
- RCON_PORT=25575
- PUBLIC_IP=10.0.0.5
- PUBLIC_PORT=8211
- SERVER_NAME=jammsen-docker-generated-###RANDOM###
- SERVER_DESCRIPTION=Palworld-Dedicated-Server running in Docker by jammsen
- SERVER_PASSWORD=serverPasswordHere
- ADMIN_PASSWORD=adminPasswordHere
volumes:
- ./game:/palworld
  • 修改游戏参数
1
$ vim ~/palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
  • 需要注意的是不可修改默认环境变量中存在参数,例如端口号,服务器密码,服务器名,等参数,因为修改了也不会生效,因为重启容器会默认加载环境变量来写配置文件。

  • 如要修改环境变量中存在的参数,就需要删除该容器实例,sudo docker rm palworld-dedicated-server,重新创建一个新的容器实例,只要我们没有删除映射好的~/palworld 文件夹,就不需要重新下载游戏服务器,也不会覆盖存档因此可以放心删除容器。如果实在不放心可以备份存档。

  • 存档位置是~/palworld/Pal/Saved 文件夹,如需备份或迁移存档只需要操作该文件夹即可。

3.添加定时任务重启服务

1
2
3
4
5
$ sudo crontab -e
# 添加以下命令内容
# 0 4 * * * /usr/bin/docker restart palworld-dedicated-server
# 重启cron 服务,使定时任务生效
$ systemctl restart cron
  • 如果添加定时任务没有生效,可能是时区的问题,确定一下你的系统时区。
1
2
3
4
5
6
# 查看当前时区
$ timedatectl
# 查看当前时间
$ date
# 设置时区为上海时区
$ sudo timedatectl set-timezone Asia/Shanghai

4.frp内网穿透

4.1.实现条件

  1. 需要一台具有公网ipv4的服务器(最好是国内的服务器这样延迟低,国外的CN2 GIA 之类的高速线路延迟也不低)(经过我的测试ipv6无法解析)

  2. 带宽要求不高根据人数来确定,通常3M或以上的带宽,没有问题,不用特别去使用按量计费(1M都能跑起来,就是加载地图有点,慢,延迟也不是很高,只有不到100)。

4.2.实现代码

4.2.1.frp下载与仓库

frp仓库地址

frp实例

1
2
3
4
5
$ wget http://119.23.186.200:8000/frp_0.52.3_linux_amd64.tar.gz
$ tar -zxvf frp_0.52.3_linux_amd64.tar.gz
$ cd frp_0.52.3_linux_amd64
# vim frps.toml
# vim frpc.toml

4.2.2.实现细节

  • 服务端运行frps$: ./frps -c frps.toml
1
2
3
4
5
6
7
8
9
10
11
# frps.toml
#绑定客户端访问端口
bindPort = 7000

# 授权token
auth.method = "token"
auth.token = "baixiaochun"

# 开启dashboard界面
# webServer.addr = "0.0.0.0"
# webServer.port = 10000
  • 守护进程运行 nohup ./frps -c frps.toml >log.txt 2>&1 &

  • 客户端(服务器启动端)运行frpc$: ./frpc -c frpc.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# frpc.toml
serverAddr = "<云服务器ip>"
serverPort = 7000
auth.method = "token"
auth.token = "baixiaochun"

[[proxies]]
# 连接名称自定义,不能和服务器上的其他连接重复,否则无法连接
name = "PalServer"
type = "udp"
localIP = "127.0.0.1"
localPort = 8211
# 挂载到服务器的8211端口上
remotePort = 8211

[[proxies]]
# 连接名称自定义,不能和服务器上的其他连接重复,否则无法连接
name = "RconPalServer"
type = "tcp"
localIP = "127.0.0.1"
localPort = 25575
# 挂载到服务器的25575端口上
remotePort = 25575

  • 守护进程运行

    nohup ./frpc -c frpc.toml >log.txt 2>&1 &

  • 日志输出到当前文件夹的log.txt中

  • 可用过 ps -ef | grep frp 查看进程号,然后使用 kill -9 <PID> 来删除进程

  • Windows 运行命令为 ./frpc.exe -c frpc.toml

5.疑难杂症

  1. 需要什么配置才能运行起来?

    • 推荐4核16或以上
  2. nohup 不生效怎么办?

    • 尝试使用exit退出ssh命令终端,而不是直接关闭
    • 尝试使用screen指令来管理会话
  3. Windows服务器的存档可以迁移到linux吗?

    • 根据我的尝试是不可以的,存档文件夹中的文件名称有差异。
  4. 为什么重启服务器存档丢失?

    • 我也不知道,没遇到过,不过好像好多人遇到过,网上应该有解决办法。
  5. 服务启动和我视频显示一致,为什么就是连不上呀。

    • 注意开启防火墙8211/udp端口
    • 注意内网ip和外网ip的区别,不要在外网用内网ip去连服务器,内网ip指192.168.–/172.16.–/10.–。内网就用内网ip连,外网就用外网ip连。
  6. 为什么我linux配置在PalWorldSettings.ini文件中修改了PublicPort=8211,端口号,但是不生效。

    • 不生效的话在启动配置中添加参数./PalServer.sh port=10000,这样端口更改就生效了。(该问题仅针对非docker启动)
    • 如果是docker启动,无需修改端口号,直接在启动端口映射中映射端口就可以了-p 10000:8211
  7. 可以使用ipv6吗?

    • 根据我的尝试不可以。
  8. 服务器更新怎么解决?

    • 非docker运行下使用下载服务时运行的steamcmd 命令就可以更新了
    • docker运行添加环境变量**-e ALWAYS_UPDATE_ON_START=true **,每次启动容器实例时就更新服务器了。
  9. 在ssh终端输入密码时为什么没反应?

    • 实际输入了,只是没有回显,输入完成回车即可。
  10. 使用frp内网穿透需要服务器性能吗?

    • 不需要,网络带宽够就行。几个人用4M就差不多了,使用内网ip连的人不算人。
  11. 使用steamclient.io找不到如何解决?

    • 官网有解决方案
  12. 必须要steam有这个游戏才能开服吗?

    • 不需要,steam匿名登陆
  13. linux会比windows使用消耗内存更小吗?

    • 是的但有限。
  14. 使用docker安装和linux本机安装有什么区别?

    • docker 更方便,但性能相较于本机要稍微差一些,但也有限,docker容器技术的性能还是可以信任的,不然也不可能这么流行。
  15. Linux系统之前如何进行存档迁移

    • 迁移文件夹Pal/Saved即可
    • linux eg:~/.steam/SteamApps/common/PalServer/Pal/Saved
    • docke eg:~/palworld/Pal/Saved