尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

零基础用 Docker 部署 Sunshine 串流服务器:一份带排错思路的实战指南

零基础用 Docker 部署 Sunshine 串流服务器:一份带排错思路的实战指南 零基础用 Docker 部署 Sunshine 串流服务器一份带排错思路的实战指南【免费下载链接】SunshineSelf-hosted game stream host for Moonlight.项目地址: https://gitcode.com/GitHub_Trending/su/SunshineSunshine 是一个自托管self-hosted的游戏串流服务端为开源客户端 Moonlight 提供低延迟的远程串流能力。这篇文章是一份完整的 Sunshine Docker 部署实录从为什么装进容器讲到配对、排错与日常维护全程按我自己的踩坑顺序推进命令可直接复制运行。串流需求从哪来给书房电脑找一块移动屏幕本章帮你判断自建串流服务器适不适合你并说清 Docker 方案相对原生安装的取舍。先讲我的使用场景你对照一下是否感同身受主力机放在书房配了不错的显卡但客厅电视、卧室平板、公司笔记本都只能看着它却摸不着它。云游戏平台能解决一部分问题但游戏库受限、要额外付费、延迟还得看运气。于是我把目光放回自托管方案客户端用开源跨平台的 Moonlight服务端用同样开源的 Sunshine——它把自己定位为 self-hosted game stream host也就是专门给 Moonlight 当后厨的串流服务端。为什么偏偏要用 Docker 部署三个理由隔离干净Sunshine 依赖虚拟输入设备、GPU 编码等底层能力装原生包会把一堆运行时和规则文件洒进系统容器把这些都关在盒子里删容器等于卸载。升级回滚快换一个镜像标签重建容器就是一次完整升级出问题改回旧标签即可比备份整个系统踏实。实验成本低想试试不同版本、不同基础系统几分钟就能起一个干净环境。但这里有个必须提前说清的事实官方对 Docker 镜像的态度是实验性。项目文档明确写着镜像主要作为基础镜像供二次集成使用并且不推荐大多数用户用容器方式跑。原因不难理解——容器内没有桌面环境串流桌面这类玩法受限于此GPU 驱动也必须靠宿主机提供。所以我的结论是追求零折腾的稳定使用装官方原生包喜欢隔离、要集成进自己的编排、或频繁尝试新版本再选 Docker。本文接下来的内容都建立在你已经决定用容器的前提上。部署前的三个决定镜像标签、宿主机与数据目录本章解决拉哪个镜像、宿主机要满足什么、配置放哪三个前置问题避免装到一半才发现方向错了。镜像标签的真相为什么没有 latest如果你习惯docker pull 镜像:latest这里会踩第一个坑。从 v0.18.0 起Sunshine 的镜像标签规则彻底变了单独使用latest、master、vX.X.X这类标签都会拉取失败必须使用版本-系统的组合标签例如latest-ubuntu-24.04或v0.24.0-ubuntu-22.04。版本部分可以是版本号、latest、master甚至具体的 commit hash系统部分目前支持ubuntu-22.04、ubuntu-24.04、debian-bookworm三种后缀。选哪个后缀参考官方支持矩阵三者均支持 x86_64 与 ARM64 双架构标签后缀特点适合谁ubuntu-24.04较新的基础系统默认选择依赖较新ubuntu-22.04老而稳需要与旧环境对齐兼容性debian-bookwormDebian 系偏好 Debian 生态宿主机的最低门槛容器跑的是服务端本体但真正干活的是宿主机的 GPU。请先确认三件事显卡驱动已正确安装NVIDIA 装好驱动编码走 NVENCAMD 或 Intel 确认 VAAPI/AMF 可用有可用的硬件编码能力4K、高码率串流基本依赖硬编码纯软件编码的延迟和 CPU 占用都扛不住网络质量良好局域网优先有线无线建议 5GHz 及以上频段。PUID、PGID 与 TZ数据目录权限的三件套容器内进程以 root 运行时写进宿主机挂载目录的文件会变成 root 属主之后你在宿主机上管理这些文件就处处受阻。Sunshine 镜像提供PUID/PGID环境变量让容器内进程以你指定的身份运行。先查你的用户 IDid 你的用户名 # 输出示例uid1000(user) gid1000(user) groups1000(user)记住这两个数字后面命令里要用。TZ用来指定时区如Asia/Shanghai避免日志时间与本地时间对不上。还有一条铁律挂载的宿主机目录属主要和 PUID/PGID 一致否则容器内写不进去——这个坑后面会专门讲。5 分钟跑通最小实例一条 docker run 拆开讲本章给出一条可直接复制的启动命令并逐参数解释让你第一次启动就成功。假设数据目录定在/opt/sunshine/config一条命令创建并启动容器docker run -d \ --device /dev/dri/ \ # 把 GPU 设备直通进容器编码全靠它 --namesunshine \ # 容器名后续 docker logs 要用 --restartunless-stopped \ # 宿主机重启后自动拉起 --ipchost \ # 共享宿主机 IPC编码与抓屏更稳 -e PUID1000 \ # 容器内用户 ID用 id 命令查你自己的 -e PGID1000 \ # 容器内组 ID -e TZAsia/Shanghai \ # 时区 -v /opt/sunshine/config:/config \ # 配置持久化目录 -p 47984-47990:47984-47990/tcp \ # 信令与串流 TCP 端口 -p 48010:48010 \ # 附加功能端口TCP/UDP -p 47998-48000:47998-48000/udp \ # 视频、控制、音频 UDP 端口 lizardbyte/sunshine:latest-ubuntu-24.04端口为什么要一次性全映射因为 Sunshine 的串流不是单端口服务每个端口各有分工缺一个都可能出现连得上但黑屏配对上不了之类的诡异症状端口/范围协议作用47990TCPWeb 管理界面唯一必须外部端口可改47984-47989TCPHTTPS/HTTP 信令与 RTSP 串流通道47998-48000UDP视频流、控制流、音频流48010TCP/UDP附加功能端口启动后依次做三件事验证状态docker ps # 确认容器状态为 Up docker logs -f sunshine # 跟随日志观察有无报错日志正常后浏览器打开https://宿主机IP:47990就会看到欢迎页。浏览器提示不安全是正常的——容器默认使用自签名证书点继续访问即可。欢迎页会要求你设置 Web 界面的用户名和密码请务必记牢之后每次管理都要用它登录。最小实例跑通后下一章就是最让人期待的环节——让客户端真正连上来。从容器活着到游戏能玩与 Moonlight 完成配对本章解决部署后最关键的一步让手机、电视或笔记本上的 Moonlight 客户端连上服务端并完成 PIN 配对。容器起来、Web 界面能开只代表服务端就绪真正玩上还要走一次配对。步骤不长但顺序别乱在客户端设备上安装 Moonlight覆盖 Windows/macOS/Linux/Android/iOS 等主流平台打开 Moonlight选择手动添加主机输入 Sunshine 所在主机的局域网 IP客户端会显示一个四位 PIN 码回到 Sunshine 的 Web 界面进入顶部导航的PIN页面输入这四位数字并回车给设备起个名字客户端提示配对成功应用列表随之出现。配对之后Sunshine 的Applications页面默认自带两个条目Desktop直接串流桌面和Steam启动 Steam 大屏幕模式。你可以点 Add New 继续添加游戏或工具配置工作目录与启动命令即可。搞不清该装哪个客户端时Web 界面的Featured Apps页有官方维护的客户端清单直接从那里下载最省心。这里有两个小提示页面底部那句 Applications are refreshed only when Client is restarted 是认真的——新增或修改应用后重启一下 Moonlight 客户端才能看到变化想改画面参数分辨率、帧率、码率、开 HDR、调整输入设备都在 Web 界面的Configuration页改完记得点保存。三种运行方式的取舍docker run、Compose 与 Podman本章对比三种容器运行方式帮你按使用习惯选定长期方案。跑通最小实例只是起点长期使用总要选定一种正规军方式方式优点缺点适合谁docker run一条命令直觉参数一长串难维护临时试验docker compose配置即文件可纳入版本管理多学一个 yml 语法长期部署推荐podman无守护进程、rootless 更安全镜像源、参数略有差异桌面 Linux / 安全敏感推荐docker compose 一文件搞定把下面的docker-compose.yml存好docker compose up -d即完成部署version: 3 services: sunshine: image: lizardbyte/sunshine:latest-ubuntu-24.04 container_name: sunshine restart: unless-stopped devices: - /dev/dri:/dev/dri # GPU 直通 volumes: - /opt/sunshine/config:/config # 配置持久化 environment: - PUID1000 # 用你自己的 id 结果替换 - PGID1000 - TZAsia/Shanghai ipc: host # 关键一行别删 ports: - 47984-47990:47984-47990/tcp - 48010:48010 - 47998-48000:47998-48000/udpipc: host 到底在解决什么视频编码、音频处理和部分抓屏实现依赖进程间通信与共享内存容器默认的隔离 IPC 会限制这些能力。ipc: host让容器与宿主机共享这一层串流稳定性明显更好。除非你对安全隔离有极高要求否则建议保留这一行。Podman 用户注意 keep-idPodman 的 rootless 模式默认会把容器内用户映射为普通用户配合--usernskeep-id可以让容器内外的 UID/GID 保持一致此时PUID/PGID按需设置即可。命令与 docker 版几乎一致只需在镜像前加docker.io/前缀明确镜像源podman run -d \ --device /dev/dri/ \ --namesunshine \ --restartunless-stopped \ --usernskeep-id \ -e PUID1000 \ -e PGID1000 \ -e TZAsia/Shanghai \ -v /opt/sunshine/config:/config \ -p 47984-47990:47984-47990/tcp \ -p 48010:48010 \ -p 47998-48000:47998-48000/udp \ docker.io/lizardbyte/sunshine:latest-ubuntu-24.04Compose 跑起来之后绝大多数日常调整都在 Web 界面完成。比如想开启公网串流在Configuration页搜索 UPnP勾选后保存容器会自动尝试配置端口转发五个高频翻车现场与对应排查思路本章把新手最容易踩的坑集中拆解每条都附判断方法与修复命令。坑一配置目录写不进去保存总失败症状Web 界面改设置点保存没反应或容器日志里出现 permission denied。原因几乎都是宿主机目录属主与PUID/PGID不一致。sudo chown -R 1000:1000 /opt/sunshine/config改完重启容器再试。这个坑最容易在先建容器后建目录的顺序下出现所以建议先创建目录并设置属主再启动容器。坑二日志报错 Encoder not found / Could not open codec症状能配对成功但一开串流就失败日志里出现编码器相关的红字。多半是 GPU 设备没进容器或宿主机驱动没装好。先确认设备真的传进去了docker exec sunshine ls /dev/dri # 至少应看到 renderD128 之类的节点再看宿主机驱动vainfoAMD/Intel或nvidia-smiNVIDIA能正常输出才算就绪。项目文档里的日志截图报错形式与此类似可作为对照坑三47990 端口被占用症状Web 界面打不开docker ps却显示容器正常。换外部端口即可内部端口必须保持 47990-p 8080:47990之后用https://宿主机IP:8080访问。坑四容器里没有桌面可串症状连上了但串流桌面体验怪异。原因在于容器默认是无头环境Sunshine 串流的桌面其实是宿主机桌面会话不是容器里的桌面——这也是官方不建议多数用户用容器跑的原因之一。如果你的目标是串流整台机器的桌面原生包体验更完整容器方案更适合为某个应用如 Steam单独开一路串流的集成玩法。坑五日志时间与本地时间对不上症状日志时间总是差 8 小时。补上TZAsia/Shanghai环境变量并重建容器即可。部署之后的三件小事固定版本、备份与更新本章让容器从能跑进阶到可维护包括版本固定、配置备份和升级回滚。把标签从 latest 换掉latest会跟着上游新版本漂移可能在某个清晨悄悄升级出兼容问题。生产环境建议锁定具体版本例如v0.24.0-ubuntu-24.04以镜像仓库 Tags 页实际存在的版本为准。定期备份 /configSunshine 的所有配置含已配对设备、应用列表都在/config目录里备份它就是备份整个服务。一个简单的做法tar czf sunshine-config-backup.tar.gz /opt/sunshine/config升级与回滚升级 拉新标签 重建容器回滚 把镜像标签改回旧版本 重建容器。因为数据都在挂载目录里重建不会丢配置docker compose pull # 拉取最新镜像 docker compose up -d # 重建容器进阶玩法把它当基础镜像用官方把镜像定位为基础镜像也就是供你在此基础上叠加自己的串流环境。比如把 Steam 与 Wayland 组件一起打进去FROM lizardbyte/sunshine:latest-ubuntu-24.04 RUN apt-get update apt-get install -y \ steam \ wayland-protocols \ weston ENTRYPOINT steam sunshine这类一镜到底的方案正是 Games on Whales 等项目的玩法客户端连进来容器直接拉起 Steam 会话。想深入研究的话官方说明见 DOCKER_README.mdWeb 界面操作细节见 docs/getting_started.md。写在最后从镜像标签、最小实例、Moonlight 配对到运行方式取舍与排错维护Sunshine Docker 部署的完整链路到这里就闭环了这篇文章适合想要快速上手、又希望踩坑前先看到坑在哪里的新手也适合把镜像当基础镜像二次集成的开发者。【免费下载链接】SunshineSelf-hosted game stream host for Moonlight.项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表