refactor(deploy): separate Dev/UAT into independent full-stack environments
- Each environment now runs its own PB + LiveKit + Voice Token + frontend - UAT LiveKit: 7890, Voice Token: 7893 (separate from Dev 7880/7883) - Remove docker-compose.backend.yml, merge into dev compose - Delete duplicate bulletin migration files that caused PB crash on startup - Update CLAUDE.md, nginx configs, and .env files accordingly Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -18,9 +18,8 @@ cd frontend && npm run build
|
||||
cd frontend && npm run dev
|
||||
|
||||
# 部署脚本(根目录)
|
||||
./deploy-backend.sh # 部署 PocketBase + LiveKit + Voice Token 后端
|
||||
./deploy-dev.sh # 构建 + 部署 Dev 前端 (端口 7033)
|
||||
./deploy-uat.sh # 构建 + 部署 UAT 前端 + 后端 (端口 7034/8712)
|
||||
./deploy-dev.sh # 构建 + 部署 Dev 全套 (PB + LiveKit + 前端, 端口 7033/8090)
|
||||
./deploy-uat.sh # 构建 + 部署 UAT 全套 (PB + LiveKit + 前端, 端口 7034/8712)
|
||||
./stop-all.sh # 停止所有服务
|
||||
|
||||
# Electron 桌面端
|
||||
@@ -31,11 +30,14 @@ cd electron && npm run start:uat # 连接 UAT 环境
|
||||
cd electron && npm run build # 打包 Windows 可执行文件
|
||||
|
||||
# 查看日志
|
||||
docker logs -f gamegroup-pb # 后端
|
||||
docker logs -f gamegroup-livekit # LiveKit 语音服务
|
||||
docker logs -f gamegroup-voice-token # Voice Token 服务
|
||||
docker logs -f gamegroup-frontend-dev # Dev
|
||||
docker logs -f gamegroup-frontend-uat # UAT
|
||||
docker logs -f gamegroup-pb # Dev PocketBase
|
||||
docker logs -f gamegroup-pb-uat # UAT PocketBase
|
||||
docker logs -f gamegroup-livekit-dev # Dev LiveKit
|
||||
docker logs -f gamegroup-livekit-uat # UAT LiveKit
|
||||
docker logs -f gamegroup-voice-token-dev # Dev Voice Token
|
||||
docker logs -f gamegroup-voice-token-uat # UAT Voice Token
|
||||
docker logs -f gamegroup-frontend-dev # Dev 前端
|
||||
docker logs -f gamegroup-frontend-uat # UAT 前端
|
||||
```
|
||||
|
||||
**重要**: 不要在本地启动 vite dev server,使用 Docker 部署后通过端口访问测试。Dev 环境在 `http://192.168.1.14:7033`。部署到 UAT 前必须等用户确认。
|
||||
@@ -56,10 +58,10 @@ docker logs -f gamegroup-frontend-uat # UAT
|
||||
|------|-----|-----|
|
||||
| 前端 (nginx) | 7033 | 7034 |
|
||||
| PocketBase | 8090 | 8712 |
|
||||
| LiveKit | 7880/7881/7882 | 7880/7881/7882 |
|
||||
| Voice Token | 7882 | 7882 |
|
||||
| LiveKit | 7880/7881/7882(udp) | 7890/7891/7892(udp) |
|
||||
| Voice Token | 7883 | 7893 |
|
||||
|
||||
Docker Compose 文件:`docker-compose.backend.yml`、`docker-compose.dev.yml`、`docker-compose.uat.yml`,共享 `gamegroup-net` 网络。
|
||||
Docker Compose 文件:`docker-compose.dev.yml`(Dev 全套)、`docker-compose.uat.yml`(UAT 全套),共享 `gamegroup-net` 网络。每个环境独立运行完整的 PB + LiveKit + Voice Token + 前端服务。
|
||||
|
||||
前端 `.env` 文件:`frontend/.env.dev`(VITE_PB_URL=8711, PORT=7033)和 `frontend/.env.uat`(VITE_PB_URL=8711, PORT=7034)。注意 Dev/UAT 构建时 VITE_PB_URL 都指向 8711,因为 Docker 构建时会将其覆盖为空,由 nginx 反向代理处理。
|
||||
|
||||
@@ -76,7 +78,7 @@ pocketbase.ts (PB 客户端初始化)
|
||||
```
|
||||
|
||||
- **`api/pocketbase.ts`** — 单例 PocketBase 客户端,导出 `pb`、`getCurrentUser()`、`isAuthenticated()`、`logout()`
|
||||
- **`api/`** — 每个领域一个文件(`users.ts`, `groups.ts`, `sessions.ts`, `invitations.ts`, `games.ts`, `polls.ts`, `bets.ts`, `points.ts`, `ledgers.ts`, `assets.ts`, `memories.ts`, `notifications.ts`, `gameBlacklist.ts`, `playerBlacklist.ts`, `voice.ts`)
|
||||
- **`api/`** — 每个领域一个文件(`users.ts`, `groups.ts`, `sessions.ts`, `invitations.ts`, `games.ts`, `polls.ts`, `bets.ts`, `points.ts`, `ledgers.ts`, `assets.ts`, `memories.ts`, `notifications.ts`, `gameBlacklist.ts`, `playerBlacklist.ts`, `voice.ts`, `bulletins.ts`)
|
||||
- **`stores/`** — Pinia stores,组合式 API 风格(`defineStore('name', () => {...})`)
|
||||
- **`composables/useRealtime.ts`** — 统一管理 PocketBase 实时订阅,组件卸载时自动清理
|
||||
- **`composables/useVoiceRoom.ts`** — LiveKit 语音房间封装,处理连接/断开/麦克风/扬声器控制
|
||||
@@ -94,7 +96,7 @@ Layout (`/`) 下所有认证页面为子路由:Home, GroupView (`/group/:id`),
|
||||
|
||||
### Vite 代理 vs Nginx
|
||||
|
||||
开发环境 Vite 将 `/api` 代理到 PocketBase(去掉 `/api` 前缀)。生产环境 nginx 做同样代理,SSE realtime 连接额外禁用 buffering。Voice Token 服务通过 `/voice-api/` 路径由 nginx 代理到 7882 端口。
|
||||
开发环境 Vite 将 `/api` 代理到 PocketBase(去掉 `/api` 前缀)。生产环境 nginx 做同样代理,SSE realtime 连接额外禁用 buffering。Voice Token 服务通过 `/voice-api/` 路径由 nginx 代理到 voice-token 端口(Dev: 7883, UAT: 7893)。
|
||||
|
||||
前端 nginx 配置有两份:`nginx.conf`(dev,代理到 8090)和 `nginx.uat.conf`(代理到 8712),Docker 构建时通过 `NGINX_CONF` build arg 选择。静态资源缓存一年,HTML 不缓存。
|
||||
|
||||
@@ -105,7 +107,7 @@ Layout (`/`) 下所有认证页面为子路由:Home, GroupView (`/group/:id`),
|
||||
2. `useVoiceRoom.connect(sessionId)` 调用 `api/voice.ts` 的 `fetchVoiceToken`
|
||||
3. `fetchVoiceToken` 向后端 `/voice-api/voice-token/:sessionId` 请求 token
|
||||
4. Voice Token 服务验证用户 PB token → 查询 `team_sessions` 确认成员身份 → 签发 LiveKit JWT
|
||||
5. 前端用 token 连接 LiveKit server (`ws://192.168.1.14:7880`)
|
||||
5. 前端用 token 连接 LiveKit server(Dev: `ws://192.168.1.14:7880`, UAT: `ws://192.168.1.14:7890`)
|
||||
|
||||
HTTP 环境下 `navigator.mediaDevices` 受限,已在 `useVoiceRoom.ts` 中给出明确的 Chrome flags 引导错误提示。
|
||||
|
||||
@@ -138,6 +140,7 @@ HTTP 环境下 `navigator.mediaDevices` 受限,已在 `useVoiceRoom.ts` 中给
|
||||
- **game_blacklist** — 游戏黑名单(行为/外挂/坑货/环境差)
|
||||
- **player_blacklist** — 玩家黑名单(标签:挂机/送人头/喷人等)
|
||||
- **notifications** — 站内通知(投票/组队/入群等事件)
|
||||
- **bulletin_posts** / **bulletin_reads** — 群组信息公示板,支持置顶/优先级/已读追踪/过期时间
|
||||
|
||||
### PocketBase 注意事项
|
||||
|
||||
|
||||
Reference in New Issue
Block a user