# 🌟 飘落流星聊天室（Laravel 12 重构版）

> 一款基于 Laravel 12 + WebSocket（Reverb）+ Redis 构建的实时多人在线聊天室系统。  
> 原版为 VBScript ASP + MS Access 聊天室，现已全面升级为现代化 PHP 架构。

---

## 📋 技术栈

| 组件            | 版本     | 用途                          |
| --------------- | -------- | ----------------------------- |
| PHP             | 8.4+     | 运行环境                      |
| Laravel         | 12.x     | 后端框架                      |
| Laravel Reverb  | latest   | WebSocket 实时通讯引擎        |
| Laravel Horizon | 5.x      | Redis 队列可视化管理面板      |
| Redis           | 7.x      | 缓存 / 会话 / 队列 / 在线状态 |
| MySQL           | 8.0+     | 数据持久化存储                |
| Node.js         | 20.x LTS | 前端构建工具链（Vite）        |
| Tailwind CSS    | CDN      | 前端样式框架                  |
| Alpine.js       | 3.x      | 前端轻量交互                  |

---

## 🚀 本地开发部署

### 1. 克隆项目 & 安装依赖

```bash
git clone <仓库地址> chatroom
cd chatroom

# 安装 PHP 依赖
composer install

# 安装前端依赖
npm install
```

### 2. 环境配置

```bash
# 复制环境文件
cp .env.example .env

# 生成应用密钥
php artisan key:generate
```

编辑 `.env` 文件，配置以下关键项：

```env
# 数据库
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=chatroom
DB_USERNAME=root
DB_PASSWORD=root

# Redis（缓存/队列/会话）
REDIS_CLIENT=predis
REDIS_HOST=127.0.0.1

# 广播驱动
BROADCAST_CONNECTION=reverb

# 队列驱动
QUEUE_CONNECTION=redis

# Reverb WebSocket 配置
REVERB_APP_ID=chatroom
REVERB_APP_KEY=chatroom-key-2026
REVERB_APP_SECRET=chatroom-secret-2026
REVERB_HOST=127.0.0.1
REVERB_PORT=8080
REVERB_SCHEME=http

# 前端 WebSocket 连接配置（本地开发）
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="127.0.0.1"
VITE_REVERB_PORT=8080
VITE_REVERB_SCHEME="http"
```

### 3. 数据库初始化

```bash
# 创建数据库（MySQL 中手动执行）
# CREATE DATABASE chatroom CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 运行迁移 + 种子数据（自动创建默认房间"公共大厅"）
php artisan migrate --seed
```

### 4. 构建前端资源

```bash
npm run build
```

### 5. 启动所有服务 ⚡

本地开发需要同时运行 **3 个终端窗口**：

```
┌──────────────────────────────────────────────────────┐
│  终端 1：WebSocket 实时通讯引擎                        │
│  php artisan reverb:start                            │
│                                                      │
│  终端 2：消息队列处理器（二选一）                        │
│  php artisan horizon        ← 推荐（带 Web 监控面板）  │
│  php artisan queue:work     ← 简易版                  │
│                                                      │
│  终端 3：前端热更新（开发时可选）                        │
│  npm run dev                                         │
└──────────────────────────────────────────────────────┘
```

> **说明：**
>
> - Reverb 不启动 → 在线用户列表无法加载，消息无法实时推送
> - Queue 不启动 → 消息无法广播，聊天记录无法存入数据库
> - 如果使用 Herd，Web 服务器已自动运行，无需 `php artisan serve`

### 6. 访问聊天室

打开浏览器访问 `http://chatroom.test`（Herd）或 `http://localhost:8000`

---

## 🖥️ 生产服务器部署（宝塔面板）

### 1. 服务器环境要求

- PHP 8.4+（启用 `redis`、`pcntl`、`sockets` 扩展）
- MySQL 8.0+
- Redis 7.x
- Nginx
- Node.js 20.x
- Supervisor（守护进程管理）

### 2. 上传代码 & 安装依赖

```bash
cd /www/wwwroot/chat.ay.lc

# 安装生产依赖（不含开发依赖）
composer install --optimize-autoloader --no-dev

# 安装前端依赖并构建
npm install
npm run build
```

### 3. 环境配置

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://chat.ay.lc

# Reverb（服务端监听本机，由 Nginx 反代）
REVERB_HOST=127.0.0.1
REVERB_PORT=8080
REVERB_SCHEME=http

# 前端通过 HTTPS 域名连接（Nginx 反向代理到 8080）
VITE_REVERB_HOST="chat.ay.lc"
VITE_REVERB_PORT=443
VITE_REVERB_SCHEME="https"
```

### 4. 数据库迁移

```bash
php artisan migrate --seed --force
```

### 5. 优化缓存

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

### 6. Nginx 配置

在宝塔面板的 Nginx 配置中，需要添加 WebSocket 反向代理。

**第一步：** 在 `server {}` 块的**外面上方**添加：

```nginx
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
```

**第二步：** 在 `server {}` 块**内部**（`#REWRITE-END` 之后）添加：

```nginx
location /app {
    proxy_pass             http://127.0.0.1:8080;
    proxy_http_version     1.1;
    proxy_set_header       Upgrade $http_upgrade;
    proxy_set_header       Connection $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_read_timeout     120s;
    proxy_send_timeout     120s;
    proxy_buffering        off;
}

location /apps {
    proxy_pass             http://127.0.0.1:8080;
    proxy_http_version     1.1;
    proxy_set_header       Upgrade $http_upgrade;
    proxy_set_header       Connection $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_read_timeout     120s;
    proxy_send_timeout     120s;
    proxy_buffering        off;
}
```

**第三步：** 在宝塔面板 → 网站 → 伪静态中选择 `laravel5`。

**第四步：** 测试并重载 Nginx：

```bash
nginx -t && systemctl reload nginx
```

> 📄 完整的 Nginx 配置示例见项目根目录 `nginx.conf.example`

### 7. Supervisor 守护进程（关键！）

在宝塔面板 → 软件商店 → 安装「Supervisor管理器」，然后添加两个守护进程：

#### 进程一：Laravel Reverb（WebSocket 服务器）

| 配置项   | 值                         |
| -------- | -------------------------- |
| 名称     | `chatroom-reverb`          |
| 运行目录 | `/www/wwwroot/chat.ay.lc`  |
| 启动命令 | `php artisan reverb:start` |
| 进程数量 | `1`                        |

#### 进程二：Laravel Horizon（队列处理器）

| 配置项   | 值                        |
| -------- | ------------------------- |
| 名称     | `chatroom-horizon`        |
| 运行目录 | `/www/wwwroot/chat.ay.lc` |
| 启动命令 | `php artisan horizon`     |
| 进程数量 | `1`                       |

> ⚠️ **如果不配置 Supervisor：**
>
> - 关闭 SSH 终端后，Reverb 和 Horizon 会立刻停止
> - 聊天室将无法发送/接收消息，在线列表为空

---

## 🔧 常用运维命令

```bash
# 清除所有缓存
php artisan cache:clear && php artisan view:clear && php artisan config:clear

# 查看队列状态（浏览器访问）
# https://chat.ay.lc/horizon （需要 15 级以上管理员权限）

# 查看 Reverb 连接调试信息
php artisan reverb:start --debug

# 重建前端资源（修改 JS/CSS 后）
npm run build

# 代码格式化
vendor/bin/pint
```

---

## 📁 项目结构概览

```
chatroom/
├── app/
│   ├── Events/          # WebSocket 广播事件（MessageSent, UserJoined, UserLeft...）
│   ├── Http/
│   │   ├── Controllers/ # 控制器（ChatController, RoomController, AuthController...）
│   │   ├── Middleware/   # 中间件（ChatAuthenticate, LevelRequired）
│   │   └── Requests/    # 表单验证
│   ├── Jobs/            # 异步队列任务（SaveMessageJob）
│   ├── Models/          # Eloquent 模型
│   └── Services/        # 业务服务层（ChatStateService, MessageFilterService）
├── config/
│   └── reverb.php       # Reverb WebSocket 配置
├── resources/
│   ├── js/
│   │   ├── bootstrap.js # Laravel Echo + Reverb 前端初始化
│   │   └── chat.js      # 聊天室前端 WebSocket 事件监听
│   └── views/
│       ├── auth/        # 登录页面
│       ├── chat/        # 聊天室主界面（frame.blade.php）
│       ├── rooms/       # 房间大厅
│       ├── leaderboard/ # 排行榜
│       ├── guestbook/   # 留言板
│       └── admin/       # 后台管理
├── routes/
│   ├── web.php          # Web 路由
│   └── channels.php     # WebSocket 频道鉴权
├── nginx.conf.example   # Nginx 配置示例
└── .env.example         # 环境变量模板
```

---

## 📜 开源协议

本项目基于 [MIT License](https://opensource.org/licenses/MIT) 开源。
