一、速览

入门

screego 是一个面向开发者的自托管屏幕共享工具。它的核心场景很聚焦:你在本地写代码,想让同事实时看到你的屏幕画面,但又不想忍受 Teams、Zoom 这类视频会议软件在共享代码时出现的明显延迟和画质压缩。

项目用 Go 实现,基于 WebRTC 点对点传输。这意味着视频流不经过中心服务器转发(除非 NAT 穿透失败需要 TURN 中继),延迟通常可以控制在几百毫秒以内,代码文本依然锐利可读。它只做「屏幕共享」这一件事,不包含聊天、录制、白板等附加功能。

如果你有协同调试、结对编程、远程演示代码的需求,又不想把画面交给第三方平台,screego 是一个轻量且私密的方案。

Screen Sharing

二、安装

入门

screego 提供两种安装方式:单二进制文件和 Docker 镜像。单文件适合临时体验或在没有容器环境的服务器上运行,Docker 则更适合正式部署。

方式一:直接下载二进制

从 GitHub Releases 页面下载对应平台的最新版本压缩包,解压后即可运行:

wget https://github.com/screego/server/releases/download/v1.14.1/screego_1.14.1_Linux_x86_64.tar.gz
tar -zxvf screego_1.14.1_Linux_x86_64.tar.gz
./screego

方式二:Docker 部署(推荐)

docker run -d \
  --name screego \
  --restart=unless-stopped \
  -p 5050:5050 \
  -p 3478:3478/udp \
  -v /path/to/config:/app/config \
  screego/server

容器首次启动如果没有配置文件,会自动生成一份默认配置并退出,方便你在此基础上修改。

注意:端口 5050 是 Web 界面和信令服务的入口,3478/udp 是内置 TURN 服务器使用的端口。两者缺一不可。

三、核心用法

进阶 · 推荐细读

启动成功后,访问 http://你的服务器IP:5050,你会看到一个欢迎页面。screego 的核心逻辑非常简单:创建房间,加入房间,共享屏幕

创建房间

点击页面上的创建按钮,系统会生成一个带唯一 ID 的链接:

https://your-server:5050/r/abc123

加入并共享

把链接发送给需要观看的同事。对方打开链接后,浏览器会请求访问你的屏幕和摄像头权限。授权后,屏幕画面通过 WebRTC 直接传输到对方的浏览器,不需要安装任何客户端插件。

参与者模型

  • 共享者:创建房间的人,负责共享自己的屏幕
  • 观看者:通过链接加入的人,可以多人同时观看
  • 切换角色:观看者也可以申请共享,适合结对编程时交替操作

screego 的公共演示实例托管在 app.screego.net,你可以直接打开体验一下流程。不过公共实例的服务器在海外,国内访问延迟较高,自部署体验会更好。

四、配置

进阶 · 推荐细读

screego 使用 TOML 格式的配置文件。首次运行二进制后,会在当前目录生成 config/screego.config,Docker 方式则通过挂载卷生成。

核心配置项

# 外部访问地址,必须是客户端能访问到的地址
SCREEGO_EXTERNAL_IP = "your-server-ip"

# Web 界面端口
SCREEGO_PORT = 5050

# 信令服务器地址,通常与外部 IP 一致
SCREEGO_SERVER_ADDRESS = "0.0.0.0:5050"

# TURN 服务器配置
SCREEGO_TURN_PORT = 3478
SCREEGO_TURN_REALM = "turn.screego.net"

# 密钥,用于生成房间 ID 的加密签名
SCREEGO_SECRET = "a-random-string"

# 是否启用 HTTPS
SCREEGO_HTTPS = true

关键点:外部 IP 和时间戳校验

SCREEGO_EXTERNAL_IP 必须设置为客户端能够访问到的服务器 IP 或域名。如果配置错误或服务器在 NAT 后面,观看者将无法建立 P2P 连接,画面会一直转圈。

常见的问题是:服务器在内网,通过路由器端口映射对外提供服务。此时 SCREEGO_EXTERNAL_IP 要填写公网 IP,并且需要在路由器上同时转发 TCP 5050 和 UDP 3478 端口。

HTTPS 的必要性

WebRTC 在非安全上下文(非 HTTPS 或 localhost)下无法获取屏幕共享权限。如果你通过 IP 直接访问,浏览器会拦截 getDisplayMedia 调用。

解决方案有两个:

  1. 配置 Nginx 反向代理并启用 TLS 证书
  2. 使用 screego 自带的内置 HTTPS(配置 SCREEGO_HTTPS = true 并指定证书路径)
SCREEGO_HTTPS = true
SCREEGO_CERT_FILE = "/path/to/fullchain.pem"
SCREEGO_KEY_FILE = "/path/to/privkey.pem"

五、运维场景

进阶 · 推荐细读

screego 作为日常协作工具,部署后建议纳入常规运维体系。以下几个场景值得提前考虑。

使用 systemd 管理二进制进程

[Unit]
Description=Screego Server
After=network.target

[Service]
Type=simple
User=screego
WorkingDirectory=/opt/screego
ExecStart=/opt/screego/screego
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Docker 部署时固定版本

镜像标签建议使用具体的语义化版本号(如 v1.14.1),不要追 latest。screego 版本迭代会引入配置字段变化,升级前先阅读 release notes 比对配置文件差异。

监控与日志

screego 的日志输出到 stdout,直接交给 Docker 日志驱动或 systemd journal 即可。需要关注的指标:

  • 同时进行的房间数(反映并发压力)
  • 信令连接的 WebSocket 数量
  • TURN 中继流量(当 P2P 打洞失败时才会走高)

如果部署在内网仅供团队使用,观察活跃房间数就足够了。对于跨地域团队,建议在多个区域各部署一套实例,避免 TURN 中继跨洋转发造成延迟。

六、踩坑

深入 · 老手可选

screego 整体部署难度不高,但 WebRTC 的底层特性决定了有些问题在特定网络环境下必然会出现,提前了解能省去不少排查时间。

1. TURN 证书与端口冲突

内置 TURN 服务器监听 UDP 3478。如果服务器上已有其他服务占用该端口,TURN 会启动失败,但 screego 主进程可能不会退出。检查日志时容易忽略这一点。

2. 企业网络对 UDP 的限制

WebRTC 依赖 UDP 进行媒体传输。如果你的观看者身处企业网络,且防火墙只放行 TCP 80/443,P2P 连接会不断重试后失败。此时 TURN 需要以 TCP 模式运行:

SCREEGO_TURN_PORT_TCP = 3478

但即使 TURN 通过 TCP 443 中继,视频质量也会有明显下降,这是网络环境的硬约束,不是 screego 本身的问题。

3. 容器部署时的 IP 伪装

Docker 容器内部使用 NAT 网络,默认情况下 TURN 服务器响应的外部地址映射可能出错。正确做法是使用 --network=host 模式启动容器:

docker run -d \
  --network=host \
  --name screego \
  -v /path/to/config:/app/config \
  screego/server

这能确保容器直接使用宿主机网络栈,避免端口映射和 IP 混淆带来的连接失败。

4. 版本升级后的配置兼容

screego 偶尔会在新版本中移除或重命名配置项。升级后如果服务启动异常,优先检查配置文件中是否有不认识的字段——插件通常会忽略未知项,但 screego 的配置解析比较严格。

项目信息

项目
仓库 screego/server
语言 Go
Star 10,461
Fork 717
主页 https://app.screego.net

参考链接