docker 一键部署 ARK(方舟-生存进化)
此为 steam 版 ARK 的 docker 服务端,可用于搭建私人联机服务器。
搭建过程只用到官方原生的 SteamCMD docker 和 ARK Server configuration 配置。
此工程没有引入网上其他比较热门的 ARK 部署工具,所以它们的配置项均不适用
| 硬件 | 最低配置 | 推荐配置 | 流畅配置 |
|---|---|---|---|
| CPU | 2C | 4C | 8C |
| 内存 | 6G | 8G | 16G |
| 虚拟内存 | 4G | 4G | 4G |
| 硬盘 | 50G | 100G | 100G |
ARK 当前版本的服务端大小为 18812537984 bytes,约 18G,因为要从 steam 服务器下载,所以国内非常慢甚至连接不上。建议使用香港或韩国的云主机,从海外下载速度较快且不会被 GFW 拦截、国内也有不错的访问速度
- 使用 root 用户安装 python3、 docker、 docker-compose、 git
- 使用 root 用户设置虚拟内存(推荐 4G)
- 添加 id=1000 的用户到 docker 组:
usermod -aG docker $(grep 1000 /etc/passwd | awk -F: '{print $1}') - 切换到 id=1000 的用户:
su - $(grep 1000 /etc/passwd | awk -F: '{print $1}') - 之后所有步骤使用 id=1000 的用户执行
之所以要使用 id=1000 的用户,是因为下面构建的 SteamCMD docker 镜像内也强制使用了 id=1000 的用户(steam)。
由于 docker 需要从宿主机挂载服务端的游戏目录,如果宿主机使用 root 用户挂载,会导致 docker 内的用户没有权限而无法读写。所以宿主机需要使用 id=1000 的用户启动 docker。
在 Linux 中, root 的 id=0, 而 1-999 是保留给系统用户的,普通用户的 id 从 1000 开始,docker 内一般只有一个普通用户,故默认 id=1000。
- 下载此仓库:
git clone --depth 1 --branch master https://github.com/lyy289065406/ark-server-docker.git - 进入根目录:
cd ark-server-docker - 构建镜像:
bin/build.[sh|ps1](镜像中不含游戏本体,只有用于下载游戏的 SteamCMD ) - 运行镜像:
bin/run_docker.[sh|ps1]
如果不想自己构建镜像,可以使用现成的镜像: expm02/ark-server-docker:latest
安装游戏: bin/install_game.[sh|ps1],此为命令执行后会打开 SteamCMD 交互终端,依次输入:
- 创建 ARK 游戏目录:
force_install_dir /home/steam/games/ark - 匿名登录 steam :
login anonymous - 下载 ARK 服务端:
app_update 376030(游戏约 18G,超级慢而且可能失败)
app_update 376030可能会因为网络原因多次失败,重新执行即可,会断点下载
关于 steam app id 376030 ...
在 steam 中每个游戏都有一个唯一且固定的 APP ID,可以在商店页面地址中查看(跟在 /app/ 后的数字):
| APP ID | 游戏名称 | 描述 |
|---|---|---|
| 346110 | ARK: Survival Evolved | ARK 游戏客户端 |
| 376030 | ARK: Survival Evolved Dedicated Server | ARK 专用服务端 |
当 SteamCMD 通道无法安装成功时,可使用此方法(否则应该跳过):
展开
- 创建 Github 账号(若已有则跳过)
- 配置 Github SSH
- Frok 此仓库(目的是使用 SSH 下载):
https://github.com/lyy289065406/ark.git - 创建并切换工作目录:
volumes/steam/games - 使用 SSH 下载到该目录:
git clone --depth 1 --branch master git@github.com:${你的用户名}/ark.git - 切换工作目录:
cd ark - 解压大文件:
bin/unpack_7zip.[sh|ps1](需要预装 7-zip 命令行)
更多细节详见 ARK 的 README.md 说明
| 协议 | 端口 | 是否必要 | 用途 |
|---|---|---|---|
| UDP | 7777 | 是 | 服务端对玩家开放的端口,已硬编码不可修改 |
| UDP | 7778 | 是 | 同上 |
| UDP | 27015 | 是 | 被 steam 服务器列表搜索服务端所用的端口,已硬编码不可修改 |
| TCP | 32330 | 否 | RCON 服务器在线管理工具的端口 |
以上端口均需要:
- docker 映射到宿主机(已配置到 docker-compose.yml)
- 主机防火墙准入(Linux 若没有安装 iptables 则不需要)
- 云主机配置安全组策略
- 启动 ARK 服务端:
bin/run_ark.[sh|ps1] -p ${服务器密码}(默认密码已经公开,建议重新指定)
- ARK 启动约需 10 ~ 15 分钟,如果想验证是否启动成功,可以进入 docker 终端:
bin/terminal.[sh|ps1] - 输入命令
netstat -nua查看当前监听的 UDP 端口,只要把 7777 和 7778 端口刷出来则表示已成功启动
- steam 添加服务器:
- 查看
->服务器->收藏夹 - 添加服务器
->填写${云主机公网 IP}:27015-> 在此地址上寻找游戏 ... - 当在列表中看到自己的服务器名字后,点击 将选定游戏服务器添加至收藏夹
- steam 开始游戏:
- 加入线上方舟
- 筛选服务器
->收藏 - 加入
->输入服务器密码 - 和小伙伴愉快游戏吧 ~
通过 bin/run_ark.[sh/ps1] 实际上是调用了 ARK 的核心启动脚本 bin/ark.sh,它默认配置了一些常用配置项:
| 分类 | 配置项 | 默认值 | 用途 |
|---|---|---|---|
| 可控 | SessionName | EXP_ARK_Server | 在 steam 服务器列表上看到的名称 |
| 可控 | MaxPlayers | 10 | 能进入服务器的最大玩家数量 |
| 可控 | ServerPassword | EXP123456 | 玩家进入服务器时需要提供的密码 |
| 可控 | ServerAdminPassword | ADMIN654321 | 管理员激活 RCON 控制台的密码。 游戏内按 Tab打开控制台输入命令,游戏外可以安装 RCON Web Admin 输入命令。ARK 的 RCON 命令详见这里,物品 ID 详见这里。 |
| 可控 | ServerMap | TheIsland | 服务器地图 |
| 可控 | GameModIds | 服务器已安装支持的 MOD ID 列表 | |
| 可控 | ActiveMods | 服务器当前激活的 MOD ID 列表 | |
| 可控 | DifficultyOffset | 0.2 | 游戏难度。难度越高、怪物等級越高 |
| 可控 | HarvestAmountMultiplier | 1.0 | 资源获得倍率,最大值 3 。 影响行为包括:砍伐树木、采摘浆果、分解尸体、开采岩石等 |
| 可控 | TamingSpeedMultiplier | 1.0 | 驯服恐龙倍率,最大值未知。此项越大、驯服速度越快 |
| 可控 | ResourcesRespawnPeriodMultiplier | 1.0 | 资源重生倍率。此项越小、重生速率越快。资源包括:树木、岩石、灌木等 |
| 可控 | CropGrowthSpeedMultiplier | 1.0 | 作物生长倍率。此项越大、作物成长越快 |
| 可控 | XPMultiplier | 1.0 | 指定玩家、部落和恐龙在各种行动中获得的经验获得倍率。此项越大、获得经验越多 |
| 硬编码 | serverPVE | True | PVE 模式 |
| 硬编码 | RCONEnabled | True | 是否启用 RCON 协议管理游戏 |
| 硬编码 | RCONPort | 32330 | RCON 的服务端口 |
| 硬编码 | servergamelog | 记录 Admin 在 RCON 的操作日志 | |
| 硬编码 | ShowFloatingDamageText | True | 类似 RPG 游戏浮现伤害文字 |
| 硬编码 | AllowFlyerCarryPvE | True | 在 PvE 模式中,允许玩家在骑乘翼龙时、捡起其他恐龙和玩家 |
| 硬编码 | bAllowPlatformSaddleMultiFloors | True | 允许建筑多个平台楼层 |
| 硬编码 | ServerAutoForceRespawnWildDinosInterval | 服务器重启时强制刷新野生恐龙 | |
| 硬编码 | AutoDestroyStructures | 随着时间推移,自动销毁附近废弃的部落建筑 | |
| 硬编码 | NoBattlEye | 不启动 BattleEye 反作弊工具 | |
| 硬编码 | crossplay | 允许跨平台(Epic 和 Steam 互通) | |
| 硬编码 | usecache | 加快 70% 的加载速度 | |
| 硬编码 | server | 作为服务器启动(可有可无) | |
| 硬编码 | log | 在游戏内记录部落日志(默认按 L 查看) |
启动过一次服务端后,会在 ShooterGame/Saved/Config/LinuxServer/ 目录下自动创建 GameUserSettings.ini 和 Game.ini 配置文件,可以参考 ARK Server configuration 的参数说明修改这些配置文件。
除了上表的可控配置项,均可在配置文件中修改。否则需要修改脚本 bin/ark.sh。
- 修改完成后,需要停止镜像:
bin/stop.[sh|ps1] - 如果修改过
bin/ark.sh,还需要重新构建镜像:bin/build.[sh|ps1] - 再次运行镜像:
bin/run_docker.[sh|ps1] - 然后运行 ARK 服务端:
bin/run_ark.[sh|ps1]
只有第一次需要执行上述的步骤,配置好之后,只需要简单 3 条命令即可:
- 停止镜像:
bin/stop.[sh|ps1] - 运行镜像:
bin/run_docker.[sh|ps1](参数见脚本内) - 运行 ARK:
bin/run_ark.[sh|ps1](参数见脚本内)
服务启动后会自动生成以下 3 个目录:
- 配置目录:
./volumes/steam/games/ark/ShooterGame/Saved/Config/* - 存档目录:
./volumes/steam/games/ark/ShooterGame/Saved/SavedArks/* - 日志目录:
./volumes/steam/games/ark/ShooterGame/Saved/Logs/*
迁移前可以执行脚本 bin/backup.[sh|ps1] 将其备份到 backup 目录。
建议设置 crontab -e 定时任务自动备份 :
# 每小时备份一次存档
# 其中把 ${ARK_DIR} 换成实际 ark-server-docker 工程的绝对路径
# 例如: /home/steam/workspace/github/ark-server-docker
0 */1 * * * cd ${ARK_DIR} && bin/backup.sh > /tmp/backup.log
bin/backup.[sh|ps1]脚本会自动删除 3 天前的存档记录,避免服务器硬盘溢出
在 ark-mods 仓库中列出了推荐的 MOD。
把期望要安装的 MOD 复制到 ./volumes/steam/games/ark/ShooterGame/Content/Mods 目录后,在使用 bin/run_ark.[sh|ps1] 脚本启动服务器时,通过 -i ${MOD_IDS} 按需指定即可。
详见 《在 ARK 安装 MOD 指引》
虽然用 bin/run_ark.[sh|ps1] 脚本可以一键启动,但是定制个性化服务时的启动参数还是太多,不方便记忆。
所以可以自行再添加一些封装脚本在 sbin 目录(此目录不会把文件同步到 Git 仓库),可以参考样例 sbin/onekey_demo.sh:
#!/bin/bash
# sbin/onekey_demo.sh
#------------------------------------------------
# 示例:sbin/onekey_demo.sh
# [-s ${ServerName}] # 服务器名称(在 steam 服务器上看到的)
# [-m ${MapName}] # 地图名
# [-c ${PlayerAmount}] # 最大玩家数
# [-p ${ServerPassword}] # 服务器密码
# [-a ${AminPassword}] # 管理员密码
# [-d ${Difficulty}] # 游戏难度
# [-h ${HarvestAmount}] # 资源获得倍率
# [-t ${TamingSpeed}] # 驯服恐龙倍率
# [-r ${ResourcesRespawnPeriod}] # 资源重生倍率
# [-g ${CropGrowthSpeed}] # 作物生长倍率
# [-x ${XPMultiplier}] # 经验获得倍率
# [-i ${ModIds}] # 地图 MOD ID 列表,用英文逗号分隔
#------------------------------------------------
# 启动容器
bin/run_docker.sh
sleep 5
# 启动 ARK 服务端
bin/run_ark.sh -s "EXP_ARK_Server" -p "EXP123456" -a "ADMIN654321" \
-h "3" -t "5" -r "0.5" -g "2" -x "10" -c "10" \
-m "Ragnarok" -i "1404697612,928102085,2885013943,751991809,731604991,889745138,902616446,1211297684,893904615,895711211,1232362083,618916953,722649005"
因为 steam 的客户端会自动升级,当版本不匹配时,客户端无法找到服务端,此时需要使用 steam 通道在线升级:
- 重新构建镜像(因为新版本需要更新 SteamCMD 才能下载):
bin/build.[sh|ps1] -c OFF - 启动容器:
bin/run_docker.[sh|ps1] - 打开 steam 交互终端:
bin/install_game.[sh|ps1] - 匿名登录 steam :
login anonymous - 更新 ARK 服务端:
app_update 376030 validate(游戏约 18G,超级慢而且可能失败)
- 构建 ARK 环境镜像:
bin/build.[sh|ps1] - 发布 ARK 环境镜像:
bin/deploy.[sh|ps1] - 运行 ARK 环境容器:
bin/run_docker.[sh|ps1](参数见脚本内) - 安装 ARK 服务端:
bin/install_game.[sh|ps1] - 运行 ARK 服务端:
bin/run_ark.[sh|ps1](参数见脚本内) - 进入 ARK 环境容器终端:
bin/terminal.[sh|ps1](参数见脚本内) - 停止 ARK 服务端与环境容器:
bin/stop.[sh|ps1] - 备份 ARK 服务端存档:
bin/backup.[sh|ps1] - 恢复 ARK 服务端存档:
bin/recover.[sh|ps1] - 清除 ARK 服务端存档、配置和日志文件:
bin/clean.[sh|ps1]




