Skip to content

Yueby/music-together

Repository files navigation

Music Together

Music Together

在线多人同步听歌平台 -- 创建房间,邀请朋友,一起实时听同一首歌。

English

Stars Forks Issues License

React Vite Tailwind CSS Socket.IO Express Docker

截图

桌面端

首页 搜索 播放 聊天
首页 搜索 播放 聊天

移动端

首页 搜索 播放 聊天
首页 搜索 播放 聊天

歌词展示对比

桌面端歌词 竖屏默认(封面) 竖屏歌词模式
桌面端歌词 竖屏默认 竖屏歌词

功能特性

  • 实时同步播放 -- 基于 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 音乐登录参考

协议

AGPL-3.0

About

在线多人同步听歌平台 — 创建房间,邀请朋友,一起实时听同一首歌

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages