
Superpowers 这个关键词最近在开发者圈子里热度不低。你要是搜过它大概率和我当初一样被铺天盖地的“超能力”字眼搞得一头雾水——什么超级力量、什么神秘技能点进去全是些不着边际的内容。实际上Superpowers 是一个完全开源、基于 Web 的实时协作开发环境。直白点说它把 IDE 搬进了浏览器而且从底层就是为多人实时协作设计的。你在键盘上敲代码队友的屏幕上几乎是同步出现字符流那体验比几个人挤在一个屏幕前或者痛苦地轮流操作要爽太多了。我自己是从一次黑客松经历中接触到这个项目的。当时我们组五个人有人要改前端有人调后端接口有人负责写设计文档用传统方式光是同步代码和解决冲突就浪费了大半天。后来临时切换到 Superpowers协作效率提升非常明显那次经历之后我就彻底记住了这个工具。这篇内容我打算把从零安装、部署到实际使用的完整路径走一遍。包括它的架构思路、两种主流的部署方式怎么选、静态资源域名和 WebSocket 端口这些容易踩坑的配置细节以及我实际跑项目时遇到的几个典型问题。如果你是第一次听说这玩意儿看完这篇应该能直接动手搭一套能用的环境出来。如果你已经在用了后面那几个坑的记录也许能帮你省点时间。1. Superpowers 到底是个什么工程1.1 核心设计浏览器就是完整的 IDESuperpowers 的特别之处在于它的整个客户端都是跑在浏览器里的。前端界面用 TypeScript React 构建通过网络实时同步你在编辑器里的每一次击键、每一次光标移动、每一次文件保存。这背后有一个我自己很欣赏的设计思路它的服务端和客户端共享了很大一部分逻辑代码。比如操作转换Operational Transformation相关的计算、文档模型的构建这些核心逻辑在服务端和浏览器端是同一份代码。这意味着你在浏览器里对文档做的每一个操作服务端都是用同一套逻辑来理解和合并的一致性天然有保证。我之前给其他开发者解释这个设计时经常用到一个类比这就像两个人同时在一张纸上画画Superpowers 不是简单地把两幅画叠在一起而是有一颗“大脑”实时计算两个人笔尖的轨迹保证最终合并出来的图画是两个人有意义的合作结果而不是乱七八糟的线条堆叠。这就是它的项目名“Superpowers”想表达的——每个人的能力有限但协作起来就能放大成超能力。1.2 为什么选它而不是 VS Code Live Share市面上提到协作编程很多人第一时间想到的是 VS Code 的 Live Share 插件。这个思路完全不同值得放在一起对比Live Share 是在你本地已经跑起来的 IDE 上做共享它依赖你本地装好各种环境、依赖、插件本质上是“把本地能力分享给别人”。Superpowers 是直接把开发环境托管在服务器上你只需要一个现代浏览器不管你在 Windows、macOS 还是 iPad 上打开网页就能获得完整的开发体验。这种差异在实际场景中感知很强。比如项目临时需要一个外部设计师或产品经理进来看看代码、改改文案用 Live Share 得让他们先装 VS Code、配环境流程很长。用 Superpowers扔一个链接过去就完事了打开就是项目界面零门槛。还有一次我用 iPad 躺床上想改个样式本地环境没带直接浏览器访问服务器上的 Superpowers 就搞定了。这种随时随地能干活的感觉才是它真正的价值所在。1.3 适用场景清单根据我的实际使用体验适合用 Superpowers 的场景大概是这几类黑客松、编程马拉松这类强时效性、多人协作密集的活动。安装简单、零终端依赖WiFi 一联就能开干。远程教学和编程培训。老师开一个项目空间学生通过浏览器加入代码运行结果实时可见教学互动性提高不少。快速原型验证和小型项目开发。如果你不想在本地为一个小 demo 专门折腾 Node 版本、包管理器直接在服务器上开个 Superpowers 项目就能写。多人需要同时编辑一份文档或脚本的轻量协作场景。它的定位比较明确专注浏览器端的实时协作开发体验不是一个要取代你本地重型 IDE 的工具。理解这一点部署和使用起来思路就会清晰很多。2. 安装前的准备工作与部署方案选择2.1 你需要准备的硬件和软件环境在动手之前先把环境清单列清楚。我踩过几次坑之后得出的结论是一台 Linux 服务器Ubuntu 20.04 或 22.04 比较稳、至少 1 核 2G 内存是跑得比较舒服的底线配置。如果只是本地体验或者自己一个人用Windows 或 macOS 本机跑也没问题Node.js 环境装好就行。但如果要多人协作建议还是放到公网服务器上。毕竟 Superpowers 的价值在于其他人能通过网络访问到你的开发空间。软件层面必须安装 Node.js 和 npm。这里有一个关键点要特别提醒Superpowers 官方对 Node 版本有要求太老或太新的版本都可能出问题。我自己最初在 Node 22 环境下部署时遇到过依赖编译报错后来切回 Node 18 LTS 就顺畅了。建议不要用太新的主版本保守一点用 LTS 版本最省心。2.2 部署方案怎么选裸跑与容器化的对比我梳理了一下主流的部署方式主要有两种各有各的适用场景。第一种是直接用 Node.js 在服务器上裸跑。这种方式最直接没有额外抽象层出问题好排查修改配置后重启一下就行。适合小规模团队、临时项目、以及你想快速验证一个想法的场景。第二种是用 Docker 容器化运行。Superpowers 官方提供了 Docker 镜像把整个运行环境打成包服务器上只需要有 Docker 引擎。这种方式的优势是隔离性好、一键部署、不用担心宿主机的 Node 版本污染。如果你的服务器上还跑了其他业务不希望 Superpowers 的依赖影响到别的应用Docker 是比较合适的选择。我的建议是如果是自己折腾着玩、或者只需要给三五个人协作裸跑足够了如果是正式点的环境、服务器上还跑着其他服务用 Docker 更省心。下面的实操部分我会把两条路径都写清楚你可以按自己情况选一条走。2.3 域名与端口规划这里要提前规划好两个东西服务端口和静态资源来源。Superpowers 默认监听端口是 4237你可以在配置里改。但不管用哪个端口有一点要提前搞清楚Superpowers 的页面本身HTML、JS、CSS和实时通信WebSocket 连接走的是不同的通道。如果你的部署环境有反向代理比如 Nginx需要同时代理 HTTP 和 WebSocket 流量。WebSocket 的连接路径默认是/ws反向代理时必须单独处理 Upgrade 头。很多人第一次部署出来页面能打开但一直连不上十有八九就是反向代理没配 WebSocket 转发。域名的话开发调试阶段直接用 IP 端口访问就行不用急着配域名。如果要正式用建议配一个子域名后面我会给出 Nginx 配置参考。3. 实操全过程从零搭起一套 Superpowers下面这部分我结合自己实际部署的经历把两种方式的具体步骤逐步写出来。3.1 直接使用 Node.js 部署3.1.1 安装 Node.js 环境我用的是 Ubuntu 服务器先装 Node.js 18 LTS。这里推荐用 NodeSource 的源比系统自带源版本更新、更好控制curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs装完后确认版本node -v npm -v正常情况下应该看到 v18.x.x 和对应的 npm 版本。如果之前装过其他版本的 Node建议先彻底清理再装避免版本残留导致编译阶段报奇怪的错。3.1.2 获取项目代码Superpowers 的官方代码仓库在 GitHub 上。我习惯用 git clone 拉到服务器git clone https://github.com/superpowers/superpowers.git cd superpowers这里要注意Superpowers 是一个 monorepo包含 server、client、core 等多个 npm 包。拉下来之后需要先安装依赖再构建客户端资源。3.1.3 安装依赖并构建在项目根目录下执行npm install npm run buildnpm install 需要一点耐心依赖比较多。如果国内服务器下载慢可以给 npm 配一下国内镜像源能省大量时间npm config set registry https://registry.npmmirror.com构建完成后客户端代码会被打包到public目录下。这一步的本质是把 TypeScript/React 源码编译成浏览器可以直接加载的静态资源。如果你跳过这一步直接启动服务大概率会看到一个空白页面因为浏览器拿不到任何可执行的 JS 文件。3.1.4 首次启动与验证启动服务前需要先了解一下配置方式。Superpowers 读取的配置主要有环境变量和配置文件两种途径。最小化启动时直接跑npm start看到日志输出类似Server listening on port 4237的信息就说明启动成功了。在浏览器里访问http://你的服务器IP:4237会出现一个欢迎页面。第一次使用会让你设置管理员账号这里设置的账号就是服务器管理员后续可以管理用户、创建项目。一个常见的坑是云服务器默认有防火墙或安全组限制如果你发现浏览器访问不了但服务明明在跑优先去检查安全组有没有放行 4237 端口。3.2 使用 Docker 部署如果你选 Docker 路线过程会精简一些。前提是服务器上已经装好 Docker 引擎这块就不展开了装好 Docker 后执行docker run -d -p 4237:4237 --name superpowers superpowers/superpowers:latest这会把官方镜像拉下来并启动容器把宿主机的 4237 端口映射到容器的 4237 端口。用 Docker 部署不用关心 Node 版本、依赖安装、构建过程镜像里都替你做好了。数据持久化方面建议把容器内的数据目录挂载到宿主机。默认情况下容器销毁后数据就丢了这显然不划算。我的习惯是挂载一个数据卷docker run -d -p 4237:4237 \ --name superpowers \ -v /opt/superpowers-data:/home/superpowers/superpowers/data \ superpowers/superpowers:latest这样即使容器重建项目数据也都还在。我建议所有用 Docker 跑有状态服务的人都养成挂载数据卷的习惯。哪天容器崩了要重建你就知道这个习惯多救命了。3.3 反向代理配置域名 HTTPS WebSocket服务器部署后直接用 IP 访问能用但不适合正式使用。没有 HTTPS浏览器会有一堆安全警告而且 WebSocket 在 HTTPS 页面下也必须走 WSS不然会被浏览器拦截。我自己的做法是用 Nginx 做反向代理 Lets Encrypt 免费证书。下面是一份我实测可用的 Nginx 配置参考假设你的域名是 superpowers.example.comSuperpowers 跑在 127.0.0.1:4237server { listen 80; server_name superpowers.example.com; location / { proxy_pass http://127.0.0.1:4237; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }这段配置里最关键的是proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection upgrade;两行它们就是用来支持 WebSocket 长连接的。没有这两行页面能打开但协作功能会全部失效。HTTPS 证书部分我建议直接用 certbot 自动申请和续期sudo apt-get install -y certbot python3-certbot-nginx sudo certbot --nginx -d superpowers.example.comCertbot 会自动修改 Nginx 配置并启用 HTTPS之后访问https://superpowers.example.com就是加密连接了。3.4 管理员配置与初始设置服务跑起来之后第一次访问时的初始化设置比较容易忽略但很重要。打开页面后系统会让你设置管理员账号。这个账号是最高权限账号可以管理用户、创建项目空间、调整系统设置。务必设置一个足够强度的密码。初始设置时还会让你配置几个路径主要是数据目录和资源目录。保持默认值通常没问题但如果你用了 Docker 挂载数据卷需要注意容器内的实际路径和宿主机挂载路径的关系别把数据路径指错了。完成初始化后建议先创建一个测试项目随便敲几行代码确认编辑和保存功能都正常再开始真正使用。这一步能帮你尽早暴露配置问题避免赶工时才发现环境不可用。4. 使用体验与核心玩法4.1 创建项目模板选择有讲究Superpowers 内置了几种项目类型。服务器版本默认支持网页应用、静态站点、空项目这些常见模板。创建项目时选好模板系统会自动帮你搭好基础的目录结构和配置文件。如果是纯前端页面选静态站点模板就够了如果要写 Node.js 后端逻辑用网页应用模板会更合适它会预置服务端相关结构。模板选错了后面也能改但提前选对能省去很多手动调整的功夫。4.2 实时协作邀请成员加入项目协作是 Superpowers 的重头戏。创建好项目后在项目设置里可以添加协作者输入对方的用户名即可。对方登录后在项目列表里就能看到你共享的项目。成员加入项目后你们看到的是完全同一个项目空间。我可以看到你正在编辑哪个文件、光标停在哪一行你改动的内容几乎实时地反映在我的屏幕上。这种同步级别比单纯靠 Git 协作高效得多。Git 解决的是异步场景下的版本管理问题而 Superpowers 解决的是同步场景下的实时协作问题两者是互补关系。代码最终要落到 Git 仓库管理但创作过程中的高频协同交给这类工具很合适。4.3 集成终端与本地运行Superpowers 内置了一个终端面板可以直接在浏览器里执行命令。这个终端跑在服务器端的项目目录下相当于你在本地终端里操作项目。这个功能的实用性很强。比如我想在项目里安装一个 npm 包直接在这个终端里npm install xxx不需要 SSH 登录服务器操作。跑开发服务器、查看日志、执行构建脚本全部在浏览器里搞定。这样一来整个开发流程就完全集中在了浏览器这个入口里使用体验很顺畅。4.4 系统管理与插件扩展作为管理员你可以在管理面板里看到所有在线用户、所有项目状态、系统资源占用等信息。Superpowers 还提供了插件扩展机制社区里有一些现成插件可以安装使用。插件系统允许你为项目加入自定义功能比如代码格式化、主题切换、导入导出工具等。我自己装过一个格式化插件团队协作时大家的代码风格统一了不少。如果你对插件开发感兴趣Superpowers 的项目结构本身就是一个很好的学习样本。5. 常见安装问题与排查实录5.1 WebSocket 连接失败页面能打开但协作断开这是初学者最容易遇到的现象页面能正常打开文件列表能看到但就是无法实时同步团队成员互相看不到对方的编辑。排查步骤先 F12 打开浏览器控制台看 WebSocket 连接报什么错。检查是否使用了反向代理。如果用了确认 Nginx 或 Caddy 配置里有没有正确处理 Upgrade 头。Nginx 配置里必须有proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade;如果是 HTTP 访问但 WebSocket 走了 WSS浏览器会拦截。要么全站 HTTP不推荐要么全站 HTTPS。检查服务器防火墙WebSocket 建立连接时也会走 4237 端口确保安全组和防火墙都放行了该端口。5.2 端口被占用启动时提示端口被占用最常见原因是之前启动的进程没有完全退出。用下面的命令找出来杀掉即可lsof -i :4237 kill -9 进程ID如果是 Docker 方式部署还要检查是否有残留容器占用了端口docker ps -a把不需要的容器删除再重建。5.3 依赖安装慢或编译失败npm install 很慢或者安装过程中某些包编译失败。优先考虑换镜像源npm config set registry https://registry.npmmirror.com如果某个包编译失败通常是 Node 版本问题。Superpowers 里对 libpng 和相关图像处理库有过兼容性问题。遇到这种情况检查 Node 版本是否符合要求建议切到 Node 18 LTS。5.4 创建项目时卡住或报错创建项目时偶尔会卡在初始化阶段。这种问题多半是数据目录权限不够Superpowers 无法在数据目录下创建子目录。解决方式sudo chown -R 当前用户 /path/to/data如果是 Docker 容器则要确认挂载的数据卷是否可写docker exec -it superpowers ls -la /home/superpowers/superpowers/data确保容器内运行用户对该目录有写权限。5.5 Docker 方式部署后数据丢失容器重建后项目数据全没了因为当初没挂载数据卷。这个不算 bug纯粹是操作习惯问题。解决方式是先把容器停掉、重新用挂载数据卷的方式启动参考前面 3.2 的配置以后容器随便删数据都留在宿主机上。下表是上述问题的速查参考问题现象最可能的原因解决方式页面能开但无法协作反代未配置 WebSocket补上 Upgrade 和 Connection 头端口启动报错进程残留或端口被占lsof 查找并杀进程或用docker ps查容器npm 安装缓慢或失败网络源问题或 Node 版本不兼容换镜像源切 Node 18 LTS创建项目卡住数据目录权限不足修改属主或容器内权限检查容器重建后数据丢失未挂载数据卷用 -v 参数重新挂载并迁移数据写在最后的一点个人感受Superpowers 这类工具用熟之后再去用传统方式协作写代码会有一种明显的“回不去”的感觉。几个关键的经验教训最后再啰嗦一遍第一部署层面Node 版本锁死 LTS别追新。我在这方面折腾掉的时间比我愿意承认的要多得多了。第二反代配置一定要把 HTTP 和 WebSocket 分开理解别只看到端口通了就以为完事了。协作功能的底层是 WebSocket这一层不通表面再正常都是白搭。第三Docker 部署务必养成挂载数据卷的习惯。数据无价一个 -v 参数就能避免一次灾难。第四初次使用一定要先跑一遍创建项目、编辑代码的完整流程确认核心链路通了再投入正式使用。这个“花五分钟验证环境”的习惯能在关键时刻帮你避开大麻烦。