Import JC Web IM
This commit is contained in:
@@ -0,0 +1,284 @@
|
||||
# Web 版部署说明
|
||||
|
||||
本文档说明 `jc-web-im` 的生产部署方式。当前 Web 版由两部分组成:
|
||||
|
||||
- Vue 构建后的静态文件,部署到 Web 根目录。
|
||||
- `dist/api/*.php` PHP 代理接口,负责安全调用本机 `im-server` / `app-server` 相关接口。
|
||||
|
||||
浏览器不能直接携带 `im-server` admin secret 访问 `18080`,所以联系人列表、备注名修改、消息发送等功能通过 PHP 代理完成。
|
||||
|
||||
## 目录
|
||||
|
||||
```text
|
||||
/var/www/jc-im/jc-web-im
|
||||
├── public/api/ # PHP 代理源码,构建时复制到 dist/api
|
||||
├── public/config/ # 运行时配置
|
||||
├── src/ # Vue 前端源码
|
||||
├── deploy/ # Nginx 示例配置
|
||||
└── dist/ # npm run build 后的生产目录
|
||||
```
|
||||
|
||||
生产环境建议让 Nginx 的 `root` 指向:
|
||||
|
||||
```text
|
||||
/var/www/jc-im/jc-web-im/dist
|
||||
```
|
||||
|
||||
## 依赖
|
||||
|
||||
服务器需要安装:
|
||||
|
||||
- Nginx
|
||||
- PHP-FPM
|
||||
- PHP 扩展:`curl`、`mbstring`
|
||||
- Node.js / npm,仅构建时需要
|
||||
|
||||
PHP 版本:
|
||||
|
||||
- 最低建议:PHP 7.4
|
||||
- 推荐:PHP 8.1 / 8.2 / 8.3
|
||||
|
||||
当前 PHP 代理代码使用 `curl_*`、`random_int`、`Throwable`、`mb_strlen` 等能力,部署前请确认 `curl` 和 `mbstring` 扩展可用。
|
||||
|
||||
## 后端服务要求
|
||||
|
||||
Web 版依赖以下服务正常运行:
|
||||
|
||||
```text
|
||||
app-server: http://127.0.0.1:18888
|
||||
im-server HTTP/API: http://127.0.0.1:18000
|
||||
im-server admin: http://127.0.0.1:18080
|
||||
```
|
||||
|
||||
`im-server admin`、IM 数据库和应用数据库配置通过 PHP-FPM 环境变量提供:
|
||||
|
||||
```text
|
||||
public/api/im_web_bootstrap.php
|
||||
```
|
||||
|
||||
需要配置:
|
||||
|
||||
```text
|
||||
IM_ADMIN_URL=http://127.0.0.1:18080
|
||||
IM_ADMIN_SECRET=请填写管理端密钥
|
||||
IM_DB_DSN=mysql:host=127.0.0.1;port=3306;dbname=wfchat;charset=utf8mb4
|
||||
IM_DB_USER=请填写数据库用户
|
||||
IM_DB_PASSWORD=请填写数据库密码
|
||||
IM_APP_DB_DSN=mysql:host=127.0.0.1;port=3306;dbname=appdata;charset=utf8mb4
|
||||
IM_APP_DB_USER=请填写应用数据库用户
|
||||
IM_APP_DB_PASSWORD=请填写应用数据库密码
|
||||
IM_DB_TIMEZONE=Asia/Bangkok
|
||||
```
|
||||
|
||||
请在 PHP-FPM pool、容器 secret 或部署平台的环境变量中配置,禁止把真实密钥提交到仓库。
|
||||
|
||||
## 构建
|
||||
|
||||
在项目目录执行:
|
||||
|
||||
```bash
|
||||
cd /var/www/jc-im/jc-web-im
|
||||
npm run build
|
||||
```
|
||||
|
||||
构建完成后,生产文件位于:
|
||||
|
||||
```text
|
||||
/var/www/jc-im/jc-web-im/dist
|
||||
```
|
||||
|
||||
## 运行时配置
|
||||
|
||||
运行时配置文件:
|
||||
|
||||
```text
|
||||
dist/config/runtime-config.js
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```js
|
||||
window.JC_WEB_IM_CONFIG = {
|
||||
appServer: 'http://your-domain:18888',
|
||||
registerConfigApi: 'http://your-domain:8024/api/register-config',
|
||||
imServerHost: 'your-domain',
|
||||
imRoutePort: 18000,
|
||||
useWss: false,
|
||||
wsPath: '/ws',
|
||||
sdkMode: 'custom-ws'
|
||||
};
|
||||
```
|
||||
|
||||
常用字段说明:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `appServer` | Web 登录、验证码等 App Server 地址 |
|
||||
| `registerConfigApi` | 注册配置接口地址 |
|
||||
| `imServerHost` | IM HTTP/API 和 WebSocket 使用的主机名 |
|
||||
| `imRoutePort` | IM route/API 端口,当前为 `18000` |
|
||||
| `useWss` | 是否使用 WSS |
|
||||
| `wsPath` | WebSocket 路径 |
|
||||
| `sdkMode` | 当前使用 `custom-ws` |
|
||||
|
||||
联系人相关 PHP 代理默认使用同源地址:
|
||||
|
||||
```text
|
||||
/api/contacts.php
|
||||
/api/update_alias.php
|
||||
/api/add_contact.php
|
||||
/api/send_message.php
|
||||
/api/messages.php
|
||||
```
|
||||
|
||||
通常不需要在 `runtime-config.js` 里单独配置这些地址。
|
||||
|
||||
## Nginx 示例
|
||||
|
||||
根据实际 PHP-FPM socket 调整 `fastcgi_pass`,例如 PHP 8.3:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 8023;
|
||||
listen [::]:8023;
|
||||
server_name your-domain _;
|
||||
|
||||
root /var/www/jc-im/jc-web-im/dist;
|
||||
index index.html;
|
||||
client_max_body_size 100m;
|
||||
|
||||
location = / {
|
||||
try_files /index.html =404;
|
||||
expires -1;
|
||||
add_header Cache-Control "no-store";
|
||||
}
|
||||
|
||||
location = /index.html {
|
||||
expires -1;
|
||||
add_header Cache-Control "no-store";
|
||||
}
|
||||
|
||||
location = /config/runtime-config.js {
|
||||
expires -1;
|
||||
add_header Cache-Control "no-store";
|
||||
}
|
||||
|
||||
location ~ ^/api/.+\.php$ {
|
||||
include snippets/fastcgi-php.conf;
|
||||
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/jc-im/jc-web-im/dist/:/tmp/";
|
||||
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
|
||||
expires -1;
|
||||
add_header Cache-Control "no-store";
|
||||
}
|
||||
|
||||
location / {
|
||||
etag on;
|
||||
try_files $uri $uri/ /index.html;
|
||||
expires 12h;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
启用配置后检查并重载:
|
||||
|
||||
```bash
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
## 防火墙建议
|
||||
|
||||
生产环境建议:
|
||||
|
||||
- 对外开放 Web 端口,例如 `80` / `443` / `8023`。
|
||||
- `18888` 如需浏览器直接访问 app-server,需要对外开放。
|
||||
- `18000` 如 WebSocket/route 需要浏览器直连,需要对外开放。
|
||||
- `18080` admin 端口不要对公网开放,只允许本机 PHP 代理访问。
|
||||
|
||||
## 验证
|
||||
|
||||
检查 PHP 语法:
|
||||
|
||||
```bash
|
||||
php -l /var/www/jc-im/jc-web-im/dist/api/contacts.php
|
||||
php -l /var/www/jc-im/jc-web-im/dist/api/update_alias.php
|
||||
```
|
||||
|
||||
检查 Web 页面:
|
||||
|
||||
```bash
|
||||
curl -I http://127.0.0.1:8023/
|
||||
```
|
||||
|
||||
检查联系人接口:
|
||||
|
||||
```bash
|
||||
curl -s -H 'Content-Type: application/json' \
|
||||
--data '{"userId":"你的用户ID"}' \
|
||||
http://127.0.0.1:8023/api/contacts.php
|
||||
```
|
||||
|
||||
成功时返回:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "success",
|
||||
"result": {
|
||||
"contacts": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
检查备注名修改接口:
|
||||
|
||||
```bash
|
||||
curl -s -H 'Content-Type: application/json' \
|
||||
--data '{"userId":"你的用户ID","targetId":"联系人ID","alias":"测试备注"}' \
|
||||
http://127.0.0.1:8023/api/update_alias.php
|
||||
```
|
||||
|
||||
成功时返回:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "success",
|
||||
"result": {
|
||||
"contact": {
|
||||
"uid": "联系人ID",
|
||||
"alias": "测试备注"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 页面能打开,但联系人加载失败
|
||||
|
||||
优先检查:
|
||||
|
||||
- PHP-FPM 是否运行。
|
||||
- Nginx 的 PHP location 是否命中 `/api/*.php`。
|
||||
- `curl` 扩展是否启用。
|
||||
- `public/api/im_web_bootstrap.php` 中 `IM_ADMIN_URL` 和 `IM_ADMIN_SECRET` 是否匹配当前 `im-server`。
|
||||
- `im-server` 的 `18080` admin 接口是否在本机可访问。
|
||||
|
||||
### 修改备注名无效
|
||||
|
||||
检查:
|
||||
|
||||
- `dist/api/update_alias.php` 是否存在。
|
||||
- Nginx 是否允许执行 `dist/api/*.php`。
|
||||
- `im-server` 是否提供 `/admin/friend/set_alias`。
|
||||
- 当前登录用户和目标联系人是否确实是好友关系。
|
||||
|
||||
### 部署后仍是旧前端
|
||||
|
||||
检查:
|
||||
|
||||
- Nginx `root` 是否指向新的 `dist` 目录。
|
||||
- 是否执行过 `npm run build`。
|
||||
- 浏览器是否缓存了旧资源。`index.html` 和 `runtime-config.js` 应配置为 `no-store`。
|
||||
|
||||
Reference in New Issue
Block a user