
rpufky/steam本容器非Valve官方Steam容器。
弃用通知
几年前我已从Docker转向其他容器解决方案,将不再维护此Docker镜像。容器在启动时会自动更新,因此在下次Ubuntu主要版本发布前应仍可使用。如需继续使用,请根据需要进行分叉和更新。
基于Docker的通用Steam专用服务器。
提供steamcmd的核心安装,用于托管专用服务器。通过wine支持,可同时托管Linux和Windows服务器。
Docker镜像包含基础Ubuntu安装,带有wine(Windows支持)和最新的steamcmd工具。
启动容器后:
为steam用户设置权限。
更新操作系统(若启用)。
更新steamcmd(若启用)。
更新指定的Steam专用服务器(若启用)。
以root身份执行/data/custom_server。
/data目录中创建此脚本并设置为可执行。不同专用服务器的完整工作示例:
| 标签 | 描述 |
|---|---|
| stable | Ubuntu 20.04:包含wine、steamcmd(包)。 |
| latest | Ubuntu 20.04:包含winehq STABLE包、steamcmd(包)。可能会损坏。 |
| experimental | Ubuntu 20.04:包含winehq STAGING包、steamcmd(包)。可能会损坏。 |
| 参数 | 功能 | 默认值 |
|---|---|---|
| SERVER_DIR | 服务器文件位置。 | /data/server |
| STEAM | steamcmd客户端位置。 | /steam |
| PLATFORM | 自动更新时强制指定的平台。linux或windows。 | windows |
| STEAM_APP_ID | 用于自动更新的Steam应用ID。 | 0 |
| STEAM_APP_EXTRAS | 可选。Steam应用更新的附加选项和值,例如设置BETA版本。 | `` |
| UPDATE_OS | 启动时更新核心操作系统。1启用,0禁用。 | 1 |
| UPDATE_STEAM | 启动时更新steamcmd。1启用,0禁用。 | 1 |
| UPDATE_SERVER | 启动时更新STEAM_APP_ID指定的专用服务器。1启用,0禁用。 | 1 |
| PUID | 运行steamcmd及挂载权限的用户ID。 | 1000 |
| PGID | 运行steamcmd及挂载权限的组ID。 | 1000 |
| LANG | 容器中使用的语言环境。 | en_US.UTF-8 |
| LANGUAGE | 容器中使用的语言环境。 | en_US:UTF-8 |
| LC_ALL | 容器中使用的语言环境。 | en_US.UTF-8 |
容器暴露的默认端口。可在Docker配置中暴露服务器所需的额外端口。
有关Steam所需端口的详细列表,请参见Steam所需端口。
| 端口 | 协议 | 是否必需 | 描述 |
|---|---|---|---|
27015 | UDP | 必需 | 游戏流量。 |
27015 | TCP | 可选 | SRCDS RCON端口。 |
27016 | UDP | 可选 | Steam公告流量。 |
| 卷 | 功能 |
|---|---|
| /data | 镜像的用户数据位置。 |
使用数据卷(-v标志)时,主机和容器之间可能出现权限问题。例如,容器内的用户可能在主机上不存在,这可能导致主机无法正确访问共享卷上的文件和文件夹。
为避免问题,可指定应用应运行的用户。
通过PUID和PGID环境变量将用户ID和组ID传递给容器。
要找到正确的ID,请在主机上使用拥有数据卷的用户执行以下命令:
id <用户名>
输出如下:
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),46(plugdev),113(lpadmin)
uid(用户ID)和gid(组ID)的值应提供给容器。
从 scratch 设置新服务器的详细步骤。工作示例见示例配置。
--- version: "3" services: steam: image: rpufky/steam:stable restart: unless-stopped ports: - 27015:27015 - 27015:27015/udp - 27016:27016/udp environment: - PUID=1000 - PGID=1000 - UPDATE_OS=1 - UPDATE_STEAM=1 - UPDATE_SERVER=1 - PLATFORM=windows - STEAM_APP_ID=443030 - TZ=America/Los_Angeles volumes: - /my/docker/server/data:/data - /etc/localtime:/etc/localtime:ro
--- version: "3" services: steam: image: rpufky/steam:stable restart: unless-stopped ports: - 27015:27015 - 27015:27015/udp - 27016:27016/udp environment: - PUID=1000 - PGID=1000 - UPDATE_OS=1 - UPDATE_STEAM=1 - UPDATE_SERVER=1 - PLATFORM=linux - STEAM_APP_ID=294420 - TZ=America/Los_Angeles volumes: - /my/docker/server/data:/data - /etc/localtime:/etc/localtime:ro
/data/custom_server是Docker容器启动时调用的脚本。您需要控制此脚本以按需求设置服务器。必须创建此脚本并确保其可执行。
提供supervisord以方便服务管理。
专用服务器文件会自动安装到${SERVER_DIR},所有Docker环境变量均可使用。
可在此处执行任何启动前配置(如更新或安装模组、备份等)。创建的任何文件将属于root,因此需确保权限已更改。
启动服务器前请降低权限,这将确保游戏存在漏洞时的最小暴露风险,并防止服务器文件的权限问题。
su - steam -c '您的服务器启动命令'
具体启动命令因安装的服务器而异。请查阅该游戏的专用服务器文档。
启动Left 4 Dead的srcsd_run Linux专用服务器:
su - steam -c "/data/server/srcds_run -console -game left4dead -map l4d_hospital01_apartment -port 27015 +maxplayers 4 -nohltv +exec /data/server.cfg"
已安装所有版本的wine(wind、wine32和wine64)。有关在wine下启动Windows专用服务器的方法,请查阅特定游戏的专用服务器文档和论坛。
bashsu - steam -c "xvfb-run --auto-servernum \ wine64 ${SERVER_DIR}/ConanSandbox/Binaries/Win64/ConanSandboxServer-Win64-Test.exe -nosteamclient -game -server -log"
注意,启动这些服务器必须启动轻量级窗口管理器。
xvfb-run --auto-servernum即用于此目的。
对于重启之间不需要保存状态的服务器,简单的bash脚本即可管理:
Windows
bash# 运行wine(适用于Windows服务器)并启动服务器。 su - steam -c "xvfb-run --auto-servernum \ wine64 ${SERVER_DIR}/ConanSandbox/Binaries/Win64/ConanSandboxServer-Win64-Test.exe -nosteamclient -game -server -log"
Linux
bash# 以steam用户启动Linux专用服务器。 su - steam -c "/data/server/startserver.sh \ -configfile=/data/server/serverconfig.xml"
如果专用服务器在关闭时需要特定的状态保存,bash可用于管理关闭过程。这适用于较简单的专用服务器。更复杂的服务器应考虑使用包含的supervisord进程管理器。
如需,确保Docker容器有超过10秒的关闭时间:
services: steam: image: rpufky/steam:latest restart: unless-stopped stop_grace_period: 1m ...
/data/custom_server:
bash#!/bin/bash # # 以Root身份运行。降低权限。 # # 捕获kill/term信号并发送SIGINT以优雅关闭Conan服务器。 PROCESS_WAIT_TIME=25 WATCHDOG_TIME=300 function shutdown() { echo '正在关闭服务器...' if [ "$(pgrep -n Conan)" != '' ]; then echo "向Conan服务器发送SIGINT(最长${PROCESS_WAIT_TIME}秒)..." kill -SIGINT `pgrep -n Conan` sleep ${PROCESS_WAIT_TIME} fi if [ "$(pgrep wine)" != '' ]; then echo "向wine进程发送SIGINT(最长${PROCESS_WAIT_TIME}秒)..." kill -SIGINT `pgrep wine` sleep ${PROCESS_WAIT_TIME} fi exit 0 } trap shutdown SIGINT SIGKILL SIGTERM function start_server() { su - steam -c "xvfb-run --auto-servernum wine64 ${SERVER_DIR}/ConanSandbox/Binaries/Win64/ConanSandboxServer-Win64-Test.exe -nosteamclient -game -server -log" } function watch_server() { if ps aux | grep [C]onanSandboxServer > /dev/null; then echo '服务器正在运行...' else echo '正在启动服务器...' start_server & fi } while true; do watch_server # 使用后台睡眠并等待以捕获信号陷阱。 sleep ${WATCHDOG_TIME} & wait done
提供supervisor以方便服务管理。如需使用进程管理器管理服务器,只需将/data/custom_server设置为:
bash/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
然后将所有supervisord配置文件放在/data/supervisord并确保设置正确权限。Supervisord将以root身份启动,应使用user=steam执行服务器以降低进程权限。
Conan Exiles服务器的supervisord示例可在此处找到。
确保Docker容器有超过10秒的关闭时间:
services: steam: image: rpufky/steam:latest restart: unless-stopped stop_grace_period: 1m ...
winetricks已安装到/usr/bin/winetricks,可在custom_server中用于应用特定补丁;执行命令时记得切换到steam用户。
custom_server
bashsu - steam -c "winetricks dotnet472" su - steam -c "winetricks vcrun2013"
debian-slim和ubuntu镜像的构建大小相差约2-3MB,因此仅使用ubuntu基础。使用包含的makefile构建:
使用ubuntu wine仓库的主steam镜像:
bashsudo make steam
使用winehq仓库的steam镜像:
bashsudo make latest
当steamcmd下载应用时发生,因为无法查询底层数据存储的配额。常见于ZFS支持的数据存储。可设置显式配额或忽略。
sudo zfs set quota=2T zpool1/docker
Wine在首次启动时可能阻塞启动事件。表现为在以下消息期间约5分钟的暂停:
"0014:err:ole:get_local_server_stream Failed: 80004002"
_"_wine_kernel_init boot event wait timed out"
后续启动不会有此延迟。容器构建中已尝试缓解,但可手动运行:
bashwineboot --update
bashxvfb-run --autoservernum wineboot --update
这被怀疑与GCC构建工具链有关,但尚未解决。参见:
当srcds_run无法将PID写入自动生成的PID文件时发生。
在容器中手动指定steam用户可访问的PID文件。
bashsrcds_run ... -pidfile /data/server/{GAME}.pid
steamclient.so或[S_API FAIL] SteamAPI_Init() ... 或本地steamclient.dll。未在路径中找到Steam Linux共享库。
确保使用su - steam -c加载完整的steam用户配置文件。
链接到本地steamclient.so文件,或将其复制到服务器二进制文件执行位置。默认位置在steam用户目录中:
bash/steam/.steam/steamcmd/linux{32,64}/steamclient.so
ln -s -f /steam/.steam/steamcmd/linux32/steamclient.so /steam/.steam/sdk32/steamclient.so
Steam徽标、SteamCMD ©2019 Valve Corporation。Steam和Steam徽标是Valve Corporation在美国和/或其他国家的商标和/或注册商标。





manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务