在线多人同步听歌平台 -- 创建房间,邀请朋友,一起实时听同一首歌。
| 首页 | 搜索 | 播放 | 聊天 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 首页 | 搜索 | 播放 | 聊天 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 桌面端歌词 | 竖屏默认(封面) | 竖屏歌词模式 |
|---|---|---|
![]() |
![]() |
![]() |
- 实时同步播放 -- 基于 NTP 时钟同步 + 定时执行,延迟极低
- 多平台音源 -- 支持网易云音乐、QQ 音乐搜索与播放
- Apple Music 风格歌词 -- 逐词高亮动画歌词,桌面端/移动端自适应
- VIP 歌曲支持 -- 网易云 QR 登录贡献 Cookie,解锁 VIP 曲目(房间级作用域)
- 权限管理 (RBAC) -- 房主 > 管理员 > 普通成员,细粒度权限控制
- 投票系统 -- 普通成员通过投票控制切歌、暂停等操作
- 播放模式 -- 顺序播放、单曲循环、列表循环、随机播放
- 实时聊天 -- 房间内文字聊天,支持系统消息
- 角色宽限期 -- 特权用户断线后保留角色 30 秒,重连自动恢复
- 移动端适配 -- 响应式设计,横竖屏自动切换布局
- Node.js >= 22
- pnpm >= 10
git clone https://github.com/Yueby/music-together.git
cd music-together
pnpm install
pnpm dev前端: http://localhost:5173 | 后端: http://localhost:3001
Docker 单镜像部署:
docker run -d --name music-together --restart unless-stopped \
-p 3001:3001 \
ghcr.io/yueby/music-together:latest如果宿主机
3001端口已被占用,修改-p 宿主机端口:容器端口左侧端口即可,例如-p 8080:3001。
默认自动模式下,前端会按当前访问地址自动连接后端;服务端默认开放所有来源访问,并根据当前请求协议自动决定 cookie 是否带 Secure。
需要显式限制来源时,再配置 CLIENT_URL:
docker run -d --name music-together --restart unless-stopped \
-p 3001:3001 \
-e CLIENT_URL=https://music.example.com \
ghcr.io/yueby/music-together:latest
CLIENT_URL现在主要用于显式白名单模式或前后端分离部署;默认自动模式下通常不再需要手动设置。如果你通过 Nginx / Caddy / 1Panel / Lucky 等反向代理暴露 HTTPS,请确保代理正确透传
X-Forwarded-Proto,否则服务端无法自动判断应该下发 Secure cookie。
push 到 main 后 GitHub Actions 自动构建镜像。详见 架构文档。
packages/
client/ -- 前端 React 应用
server/ -- 后端 Node.js 服务
shared/ -- 共享类型、常量与权限定义
| 库 | 说明 |
|---|---|
| Howler.js | Web 音频播放 |
| Apple Music-like Lyrics | 歌词组件 (GPL-3.0) |
| Meting | 多平台音乐 API |
| NeteaseCloudMusicApi Enhanced | 网易云音乐 API |
| CASL | 权限管理 |
| Zustand | 状态管理 |
| shadcn/ui | UI 组件库 |
| Motion | 动画库 |
| qq-music-download | QQ 音乐登录参考 |








