v1.2修复优化
This commit is contained in:
64
INSTALL.md
64
INSTALL.md
@@ -35,7 +35,7 @@
|
|||||||
1. 登录宝塔面板
|
1. 登录宝塔面板
|
||||||
2. 点击"网站" → "添加站点"
|
2. 点击"网站" → "添加站点"
|
||||||
3. 填写域名,PHP 版本选择 **PHP 8.0**
|
3. 填写域名,PHP 版本选择 **PHP 8.0**
|
||||||
4. 数据库选择"不创建"(安装向导中会创建)
|
4. 数据库选择"不创建"(需在安装前手动创建,安装向导不会自动创建数据库)
|
||||||
|
|
||||||
#### 3. 上传代码
|
#### 3. 上传代码
|
||||||
|
|
||||||
@@ -52,25 +52,33 @@ composer install
|
|||||||
#### 5. 设置目录权限
|
#### 5. 设置目录权限
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chmod 755 uploads/
|
chmod 755 public/uploads/
|
||||||
chmod 755 config/
|
chmod 755 config/
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 6. 配置 Nginx
|
#### 6. 配置伪静态
|
||||||
|
|
||||||
1. 在宝塔面板中找到你的站点 → 设置 → 配置文件
|
1. 在宝塔面板中找到你的站点 → 设置 → **网站目录** → 运行目录改为 `/public`
|
||||||
2. 将网站根目录修改为 `/www/wwwroot/your-domain.com/public`
|
2. 站点设置 → **伪静态** → 将 `docs/baota-nginx-snippet.conf` 的内容粘贴进去
|
||||||
3. 参考 `docs/baota-nginx-snippet.conf` 中的配置片段,添加到 server 块中
|
3. 保存配置
|
||||||
4. 保存配置
|
|
||||||
|
|
||||||
#### 7. 运行安装向导
|
> 注意:如 PHP 版本不是 8.0,需将配置中的 `php-cgi-80` 改为对应版本号。
|
||||||
|
|
||||||
|
#### 7. 创建数据库
|
||||||
|
|
||||||
|
安装向导不会自动创建数据库,需要提前手动创建:
|
||||||
|
|
||||||
|
1. 宝塔面板 → 数据库 → 添加数据库
|
||||||
|
2. 记录数据库名、用户名和密码,安装向导中需要填写
|
||||||
|
|
||||||
|
#### 8. 运行安装向导
|
||||||
|
|
||||||
访问 `http://your-domain.com/install.php`,按照向导步骤:
|
访问 `http://your-domain.com/install.php`,按照向导步骤:
|
||||||
1. **环境检查** — 系统自动检查 PHP 版本和扩展
|
1. **环境检查** — 系统自动检查 PHP 版本和扩展
|
||||||
2. **数据库配置** — 填写 MySQL 连接信息
|
2. **数据库配置** — 填写 MySQL 连接信息(数据库需提前创建)
|
||||||
3. **应用配置** — JWT 密钥(可自动生成)
|
3. **应用配置** — JWT 密钥(可自动生成)
|
||||||
4. **管理员账户** — 设置管理员用户名和密码
|
4. **管理员账户** — 设置管理员用户名和密码
|
||||||
5. **AI 供应商** — 配置至少一个 AI 服务供应商
|
5. **AI 供应商** — (可选)配置 AI 服务供应商,安装后也可在设置页面添加
|
||||||
|
|
||||||
### 方式二:手动安装
|
### 方式二:手动安装
|
||||||
|
|
||||||
@@ -96,17 +104,40 @@ composer install
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
chown -R www-data:www-data /var/www/ai-chat
|
chown -R www-data:www-data /var/www/ai-chat
|
||||||
chmod 755 uploads/ config/
|
chmod 755 public/uploads/ config/
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 4. 配置 Nginx
|
#### 4. 配置 Nginx
|
||||||
|
|
||||||
参考 `docs/nginx.conf` 配置 Nginx 站点。
|
使用 `docs/nginx.conf` 作为完整站点配置:
|
||||||
|
```bash
|
||||||
|
cp docs/nginx.conf /etc/nginx/sites-available/ai-chat
|
||||||
|
ln -s /etc/nginx/sites-available/ai-chat /etc/nginx/sites-enabled/
|
||||||
|
# 编辑 server_name 和 root 路径
|
||||||
|
nginx -t && nginx -s reload
|
||||||
|
```
|
||||||
|
|
||||||
#### 5. 运行安装向导
|
#### 5. 创建数据库
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE DATABASE ai_chat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
CREATE USER 'ai_chat'@'localhost' IDENTIFIED BY 'your_password';
|
||||||
|
GRANT ALL PRIVILEGES ON ai_chat.* TO 'ai_chat'@'localhost';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 6. 运行安装向导
|
||||||
|
|
||||||
访问 `http://your-domain.com/install.php` 完成安装。
|
访问 `http://your-domain.com/install.php` 完成安装。
|
||||||
|
|
||||||
|
### 方式三:本地开发
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php -S localhost:8080 -t public/ public/router.php
|
||||||
|
```
|
||||||
|
|
||||||
|
> 必须使用 `public/router.php` 作为路由文件,否则 `/api/*` 请求无法正确路由。
|
||||||
|
|
||||||
## 常见问题
|
## 常见问题
|
||||||
|
|
||||||
### Q: 安装页面空白?
|
### Q: 安装页面空白?
|
||||||
@@ -116,7 +147,10 @@ chmod 755 uploads/ config/
|
|||||||
检查 Nginx 错误日志:`tail -f /var/log/nginx/error.log`
|
检查 Nginx 错误日志:`tail -f /var/log/nginx/error.log`
|
||||||
|
|
||||||
### Q: 数据库连接失败?
|
### Q: 数据库连接失败?
|
||||||
确认 MySQL 服务正在运行,且数据库账号密码正确。
|
确认 MySQL 服务正在运行,且数据库已提前创建、账号密码正确。
|
||||||
|
|
||||||
### Q: SSE 流式响应不工作?
|
### Q: SSE 流式响应不工作?
|
||||||
确认 Nginx 配置中已禁用缓冲(参考 baota-nginx-snippet.conf)。
|
确认 Nginx 配置中已禁用缓冲(参考 `docs/baota-nginx-snippet.conf`)。
|
||||||
|
|
||||||
|
### Q: API 返回非 JSON 响应?
|
||||||
|
检查 Web 服务器是否正确配置了 `/api/` 路由转发。本地开发需使用 `public/router.php`。
|
||||||
|
|||||||
29
README.md
29
README.md
@@ -91,9 +91,10 @@ ai-chat/
|
|||||||
```
|
```
|
||||||
然后访问 `http://localhost:8080/`
|
然后访问 `http://localhost:8080/`
|
||||||
|
|
||||||
4. **或配置 Nginx**(生产部署)
|
4. **或配置 Web 服务器**(生产部署)
|
||||||
- 将网站根目录指向 `public/` 目录
|
- 宝塔面板:网站运行目录设为 `/public`,伪静态填入 `docs/baota-nginx-snippet.conf` 的内容
|
||||||
- 参考 `docs/nginx.conf` 或 `docs/baota-nginx-snippet.conf` 配置 Nginx
|
- 手动 Nginx:使用 `docs/nginx.conf` 作为完整站点配置
|
||||||
|
- 两种方式的详细说明见 [DEPLOY.md](docs/DEPLOY.md)
|
||||||
|
|
||||||
5. **设置目录权限**(生产部署)
|
5. **设置目录权限**(生产部署)
|
||||||
```bash
|
```bash
|
||||||
@@ -101,11 +102,16 @@ ai-chat/
|
|||||||
chown -R www:www .
|
chown -R www:www .
|
||||||
```
|
```
|
||||||
|
|
||||||
6. **运行安装向导**
|
6. **创建数据库**
|
||||||
- 访问 `http://your-domain.com/install.php`
|
- 安装向导不会自动创建数据库,请提前手动创建
|
||||||
- 按照向导步骤完成安装
|
- 宝塔面板:数据库 → 添加数据库
|
||||||
|
- 手动:`CREATE DATABASE ai_chat DEFAULT CHARSET utf8mb4;`
|
||||||
|
|
||||||
详细安装说明请查看 [INSTALL.md](INSTALL.md) 和 [DEPLOY.md](docs/DEPLOY.md)。
|
7. **运行安装向导**
|
||||||
|
- 访问 `http://your-domain.com/install.php`
|
||||||
|
- 填写数据库连接信息和 AI 服务商配置,完成安装
|
||||||
|
|
||||||
|
详细部署说明请查看 [DEPLOY.md](docs/DEPLOY.md)。
|
||||||
|
|
||||||
## 页面说明
|
## 页面说明
|
||||||
|
|
||||||
@@ -136,4 +142,11 @@ ai-chat/
|
|||||||
|
|
||||||
| 版本 | 日期 | 说明 |
|
| 版本 | 日期 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| v1.0.0 | 2026.5.5 | 初始版本,PHP 8.0 全栈实现 |
|
| v1.0.0 | 2026-05-05 | 初始版本,PHP 8.0 全栈实现 |
|
||||||
|
| v1.0.1 | 2026-05-06 | 修复首页 403 错误 |
|
||||||
|
| v1.0.2 | 2026-05-06 | 移除页面 Emoji,优化排版与交互 |
|
||||||
|
| v1.0.3 | 2026-05-06 | 全面 UI 重构(登录页 / 安装页 / CSS 变量体系) |
|
||||||
|
| v1.0.4 | 2026-05-06 | 内联脚本与样式全部迁移至外部文件 |
|
||||||
|
| v1.1.0 | 2026-05-06 | 升级 firebase/php-jwt 至 7.0.5 |
|
||||||
|
| v1.1.1 | 2026-05-07 | 资源目录迁移至 public/ 下;修复安装页 JSON 解析错误;新增 router.php |
|
||||||
|
| v1.2.0 | 2026-05-08 | 修复 3 个致命 Bug(数据库配置键名、Provider 路由、人格 Prompt 传递);AI 提供商改为安装可选;文档全面规范化 |
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ class Database
|
|||||||
|
|
||||||
$config = json_decode(file_get_contents($configPath), true);
|
$config = json_decode(file_get_contents($configPath), true);
|
||||||
|
|
||||||
$dsn = "mysql:host={$config['host']};port={$config['port']};dbname={$config['dbname']};charset=utf8mb4";
|
$dbname = $config['database'] ?? $config['dbname'] ?? '';
|
||||||
|
$dsn = "mysql:host={$config['host']};port={$config['port']};dbname={$dbname};charset=utf8mb4";
|
||||||
|
|
||||||
self::$instance = new PDO($dsn, $config['user'], $config['password'], [
|
self::$instance = new PDO($dsn, $config['user'], $config['password'], [
|
||||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
|||||||
@@ -84,6 +84,9 @@ class ChatController
|
|||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 使用供应商配置中的 type 字段确定实际驱动
|
||||||
|
$providerType = $providerConfig['type'] ?? 'newapi';
|
||||||
|
|
||||||
$options = [
|
$options = [
|
||||||
'provider' => $providerConfig,
|
'provider' => $providerConfig,
|
||||||
'systemPrompt' => $systemPrompt,
|
'systemPrompt' => $systemPrompt,
|
||||||
@@ -91,7 +94,7 @@ class ChatController
|
|||||||
];
|
];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
AIService::streamChat($providerKey, $model, $messages, $options, function ($chunk, $type = 'content') {
|
AIService::streamChat($providerType, $model, $messages, $options, function ($chunk, $type = 'content') {
|
||||||
if ($type === 'thinking') {
|
if ($type === 'thinking') {
|
||||||
self::sendSSE(['thinking' => $chunk]);
|
self::sendSSE(['thinking' => $chunk]);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -72,10 +72,9 @@ class InstallController
|
|||||||
echo json_encode(['success' => false, 'message' => '请填写数据库配置']);
|
echo json_encode(['success' => false, 'message' => '请填写数据库配置']);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!is_array($providers) || count($providers) === 0) {
|
// 供应商配置可选,安装后可在设置页面添加
|
||||||
http_response_code(400);
|
if (!is_array($providers)) {
|
||||||
echo json_encode(['success' => false, 'message' => '请至少配置一个AI服务提供商']);
|
$providers = [];
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -54,13 +54,32 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
ai-chat/
|
ai-chat/
|
||||||
├── public/ # Web 根目录
|
├── public/ # Web 根目录(Nginx 指向此目录)
|
||||||
|
│ ├── index.php # 首页入口(自动路由到登录/安装页)
|
||||||
│ ├── api.php # API 统一入口(路由分发)
|
│ ├── api.php # API 统一入口(路由分发)
|
||||||
|
│ ├── router.php # PHP 内置开发服务器路由文件
|
||||||
│ ├── login.php # 登录页面
|
│ ├── login.php # 登录页面
|
||||||
│ ├── chat.php # 聊天主页面
|
│ ├── chat.php # 聊天主页面
|
||||||
│ ├── config.php # 配置管理页面
|
│ ├── config.php # 配置管理页面
|
||||||
│ └── install.php # 安装向导页面
|
│ ├── install.php # 安装向导页面
|
||||||
├── app/ # 应用代码(命名空间 App\)
|
│ ├── assets/ # 前端静态资源
|
||||||
|
│ │ ├── css/ # 样式文件
|
||||||
|
│ │ │ ├── style.css # 全局样式
|
||||||
|
│ │ │ ├── chat.css # 聊天界面样式
|
||||||
|
│ │ │ └── markdown.css # Markdown 渲染样式
|
||||||
|
│ │ ├── js/ # JavaScript
|
||||||
|
│ │ │ ├── api.js # API 调用封装
|
||||||
|
│ │ │ ├── chat.js # 聊天核心功能
|
||||||
|
│ │ │ ├── config.js # 配置页面逻辑
|
||||||
|
│ │ │ ├── install.js # 安装向导逻辑
|
||||||
|
│ │ │ ├── login.js # 登录页面逻辑
|
||||||
|
│ │ │ ├── session.js # 会话管理
|
||||||
|
│ │ │ ├── upload.js # 文件上传
|
||||||
|
│ │ │ ├── markdown.js # Markdown 渲染
|
||||||
|
│ │ │ └── storage.js # 本地存储
|
||||||
|
│ │ └── img/ # 图片
|
||||||
|
│ └── uploads/ # 用户上传文件
|
||||||
|
├── app/ # 应用代码(命名空间 App\,PSR-4 自动加载)
|
||||||
│ ├── Config/ # 配置类
|
│ ├── Config/ # 配置类
|
||||||
│ │ ├── Database.php # 数据库连接(单例 PDO)
|
│ │ ├── Database.php # 数据库连接(单例 PDO)
|
||||||
│ │ └── AppConfig.php # 应用配置读写
|
│ │ └── AppConfig.php # 应用配置读写
|
||||||
@@ -95,21 +114,7 @@ ai-chat/
|
|||||||
│ └── layout/
|
│ └── layout/
|
||||||
│ ├── header.php
|
│ ├── header.php
|
||||||
│ └── footer.php
|
│ └── footer.php
|
||||||
├── assets/ # 前端静态资源
|
├── config/ # JSON 配置文件(安装后生成)
|
||||||
│ ├── css/ # 样式
|
|
||||||
│ │ ├── style.css # 全局样式
|
|
||||||
│ │ ├── chat.css # 聊天界面样式
|
|
||||||
│ │ └── markdown.css # Markdown 渲染样式
|
|
||||||
│ ├── js/ # JavaScript
|
|
||||||
│ │ ├── api.js # API 调用封装
|
|
||||||
│ │ ├── chat.js # 聊天核心功能
|
|
||||||
│ │ ├── session.js # 会话管理
|
|
||||||
│ │ ├── upload.js # 文件上传
|
|
||||||
│ │ ├── markdown.js # Markdown 渲染
|
|
||||||
│ │ └── storage.js # 本地存储
|
|
||||||
│ └── img/ # 图片
|
|
||||||
├── config/ # JSON 配置文件
|
|
||||||
├── uploads/ # 用户上传文件
|
|
||||||
├── docs/ # 文档
|
├── docs/ # 文档
|
||||||
└── composer.json # Composer 配置
|
└── composer.json # Composer 配置
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
1. 网站 → 添加站点
|
1. 网站 → 添加站点
|
||||||
2. 填写域名
|
2. 填写域名
|
||||||
3. PHP 版本选择 **PHP 8.0**
|
3. PHP 版本选择 **PHP 8.0**
|
||||||
4. 数据库选择"不创建"
|
4. 数据库选择"不创建"(安装向导会连接你手动创建的数据库)
|
||||||
|
|
||||||
### 3. 部署代码
|
### 3. 部署代码
|
||||||
|
|
||||||
@@ -31,30 +31,65 @@ chmod -R 755 .
|
|||||||
chown -R www:www .
|
chown -R www:www .
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. 配置 Nginx
|
### 5. 配置伪静态
|
||||||
|
|
||||||
1. 站点设置 → 网站目录 → 运行目录改为 `/public`
|
1. 站点设置 → 网站目录 → 运行目录改为 `/public`
|
||||||
2. 站点设置 → 配置文件 → 添加 `docs/baota-nginx-snippet.conf` 中的配置
|
2. 站点设置 → **伪静态** → 将 `docs/baota-nginx-snippet.conf` 的内容粘贴进去,保存
|
||||||
|
|
||||||
### 6. 运行安装向导
|
> 注意:是粘贴到"伪静态"输入框,不是"配置文件"。
|
||||||
|
> 如 PHP 版本不是 8.0,需将 `php-cgi-80` 改为对应版本号(如 `php-cgi-81`)。
|
||||||
|
|
||||||
访问 `http://your-domain.com/install.php`
|
### 6. 创建数据库
|
||||||
|
|
||||||
### 7. SSL 配置(可选)
|
安装向导不会自动创建数据库,需要你提前手动创建:
|
||||||
|
|
||||||
|
1. 宝塔面板 → 数据库 → 添加数据库
|
||||||
|
2. 记录数据库名、用户名和密码,安装向导中需要填写
|
||||||
|
|
||||||
|
### 7. 运行安装向导
|
||||||
|
|
||||||
|
访问 `http://your-domain.com/install.php`,按步骤完成安装。
|
||||||
|
|
||||||
|
### 8. SSL 配置(可选)
|
||||||
|
|
||||||
站点设置 → SSL → Let's Encrypt → 申请证书
|
站点设置 → SSL → Let's Encrypt → 申请证书
|
||||||
|
|
||||||
## 手动部署
|
---
|
||||||
|
|
||||||
### Nginx 配置
|
## 手动部署(Nginx + PHP-FPM)
|
||||||
|
|
||||||
参考 `docs/nginx.conf` 文件,将 `root` 指向 `public/` 目录。
|
### 1. 安装依赖
|
||||||
|
|
||||||
### PHP-FPM 配置
|
```bash
|
||||||
|
composer install
|
||||||
|
```
|
||||||
|
|
||||||
确保 PHP-FPM 监听 socket 配置正确(通常为 `/tmp/php-cgi-80.sock` 或 `127.0.0.1:9000`)。
|
### 2. Nginx 站点配置
|
||||||
|
|
||||||
### 目录权限
|
使用 `docs/nginx.conf` 作为完整的站点配置文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 复制到 Nginx 配置目录
|
||||||
|
cp docs/nginx.conf /etc/nginx/sites-available/ai-chat
|
||||||
|
ln -s /etc/nginx/sites-available/ai-chat /etc/nginx/sites-enabled/
|
||||||
|
|
||||||
|
# 编辑配置,修改 server_name 和 root 路径
|
||||||
|
vim /etc/nginx/sites-available/ai-chat
|
||||||
|
|
||||||
|
# 测试并重载
|
||||||
|
nginx -t && nginx -s reload
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 创建数据库
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE DATABASE ai_chat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
CREATE USER 'ai_chat'@'localhost' IDENTIFIED BY 'your_password';
|
||||||
|
GRANT ALL PRIVILEGES ON ai_chat.* TO 'ai_chat'@'localhost';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 目录权限
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chown -R www-data:www-data /path/to/ai-chat
|
chown -R www-data:www-data /path/to/ai-chat
|
||||||
@@ -62,6 +97,22 @@ chmod 755 /path/to/ai-chat/public/uploads
|
|||||||
chmod 755 /path/to/ai-chat/config
|
chmod 755 /path/to/ai-chat/config
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 5. 运行安装向导
|
||||||
|
|
||||||
|
访问 `http://your-domain.com/install.php`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 本地开发(PHP 内置服务器)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php -S localhost:8080 -t public/ public/router.php
|
||||||
|
```
|
||||||
|
|
||||||
|
> 必须使用 `public/router.php` 作为路由文件,否则 `/api/*` 请求无法正确路由到 `api.php`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 安全建议
|
## 安全建议
|
||||||
|
|
||||||
1. 配置 SSL 证书(HTTPS)
|
1. 配置 SSL 证书(HTTPS)
|
||||||
|
|||||||
@@ -1,35 +1,24 @@
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
# AI Chat 宝塔面板 Nginx 配置片段(PHP-FPM 版本)
|
# AI Chat - 宝塔面板伪静态规则
|
||||||
# ============================================================
|
# ============================================================
|
||||||
#
|
#
|
||||||
# 【使用说明】
|
# 使用方法:
|
||||||
# 1. 本文件为宝塔面板专用的 Nginx 配置片段,不是完整的站点配置文件。
|
# 宝塔面板 → 网站 → 找到你的站点 → 设置 → 伪静态
|
||||||
# 2. 使用步骤:
|
# 将本文件内容完整粘贴到伪静态输入框中,保存即可
|
||||||
# a. 在宝塔面板中创建网站,PHP 版本选择 PHP 8.0
|
#
|
||||||
# b. 将网站根目录指向 /path/to/ai-chat/public
|
# 前置条件:
|
||||||
# c. 登录宝塔面板 → 网站 → 找到你的站点 → 点击"设置"
|
# - 网站根目录已指向 public/ 目录
|
||||||
# d. 在左侧菜单选择"配置文件"
|
# - PHP 8.0 已在宝塔中安装并启用
|
||||||
# e. 将下方"配置内容开始"到"配置内容结束"之间的内容,
|
# - 如 PHP 版本非 8.0,需将下方 php-cgi-80 改为对应版本号
|
||||||
# 复制并粘贴到 server { } 块内(注意不要重复嵌套 server 块)
|
|
||||||
# f. 保存即可生效
|
|
||||||
# 3. 前置准备:
|
|
||||||
# - 在宝塔面板中安装 PHP 8.0 并启用
|
|
||||||
# - 安装 MySQL 5.7+ 或 8.0
|
|
||||||
# - 安装 Composer
|
|
||||||
# - 运行 composer install 安装 PHP 依赖
|
|
||||||
#
|
#
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
# ↓↓↓ 配置内容开始 ↓↓↓
|
# 默认路由
|
||||||
|
|
||||||
# === AI Chat 网站配置(PHP-FPM) ===
|
|
||||||
|
|
||||||
# 1. 默认路由
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /login.php;
|
try_files $uri $uri/ /login.php;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 2. API 路由 - 转发到 api.php
|
# API 路由 — 将 /api/* 请求转发到 api.php 处理
|
||||||
location /api/ {
|
location /api/ {
|
||||||
try_files $uri /api.php$is_args$args;
|
try_files $uri /api.php$is_args$args;
|
||||||
fastcgi_pass unix:/tmp/php-cgi-80.sock;
|
fastcgi_pass unix:/tmp/php-cgi-80.sock;
|
||||||
@@ -40,47 +29,39 @@ location /api/ {
|
|||||||
fastcgi_param REQUEST_URI $request_uri;
|
fastcgi_param REQUEST_URI $request_uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 3. SSE 流式响应特殊配置(AI对话需要)
|
# SSE 流式响应 — AI 对话需要禁用缓冲以实现实时输出
|
||||||
# 针对 Chat API 的 SSE(Server-Sent Events)流式响应,
|
|
||||||
# 需要禁用所有缓冲以确保实时输出
|
|
||||||
location /api/chat/completions {
|
location /api/chat/completions {
|
||||||
fastcgi_pass unix:/tmp/php-cgi-80.sock;
|
fastcgi_pass unix:/tmp/php-cgi-80.sock;
|
||||||
include fastcgi_params;
|
include fastcgi_params;
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
|
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
|
||||||
fastcgi_param REQUEST_URI $request_uri;
|
fastcgi_param REQUEST_URI $request_uri;
|
||||||
# SSE 关键配置
|
|
||||||
fastcgi_buffering off;
|
fastcgi_buffering off;
|
||||||
|
fastcgi_cache off;
|
||||||
proxy_buffering off;
|
proxy_buffering off;
|
||||||
add_header X-Accel-Buffering no;
|
add_header X-Accel-Buffering no;
|
||||||
# 超时设置(5分钟)
|
|
||||||
fastcgi_read_timeout 300s;
|
fastcgi_read_timeout 300s;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 4. 静态资源缓存(assets/ 和 uploads/ 已在 public 目录下,无需 alias)
|
# 静态资源缓存
|
||||||
location /assets/ {
|
location /assets/ {
|
||||||
expires 30d;
|
expires 30d;
|
||||||
add_header Cache-Control "public, immutable";
|
add_header Cache-Control "public, immutable";
|
||||||
}
|
}
|
||||||
|
|
||||||
# 5. 上传文件缓存
|
# 上传文件缓存
|
||||||
location /uploads/ {
|
location /uploads/ {
|
||||||
expires 7d;
|
expires 7d;
|
||||||
add_header Cache-Control "public";
|
add_header Cache-Control "public";
|
||||||
}
|
}
|
||||||
|
|
||||||
# 6. 禁止访问非公开目录(安全)
|
# 禁止访问非公开目录
|
||||||
location ~ /(app|config|vendor|tests|scripts|)/ {
|
location ~ /(app|config|vendor|tests|scripts|\.cospec)/ {
|
||||||
deny all;
|
deny all;
|
||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 7. 禁止访问隐藏文件
|
# 禁止访问隐藏文件
|
||||||
location ~ /\. {
|
location ~ /\. {
|
||||||
deny all;
|
deny all;
|
||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 8. 上传文件大小限制
|
|
||||||
client_max_body_size 10m;
|
|
||||||
|
|
||||||
# ↑↑↑ 配置内容结束 ↑↑↑
|
|
||||||
|
|||||||
@@ -1,14 +1,25 @@
|
|||||||
# AI Chat 应用 Nginx 配置(PHP-FPM 版本)
|
# ============================================================
|
||||||
# 将此文件复制到 /etc/nginx/sites-available/ 并创建软链接到 sites-enabled/
|
# AI Chat - Nginx 完整站点配置文件
|
||||||
|
# ============================================================
|
||||||
#
|
#
|
||||||
# 注意:本文件为完整的 Nginx 站点配置,适用于直接部署到 Nginx + PHP-FPM 的场景。
|
# 适用场景:直接部署到 Nginx + PHP-FPM(不使用宝塔面板)
|
||||||
# 如果你使用宝塔面板管理服务器,请参考 baota-nginx-snippet.conf 文件中的配置片段。
|
#
|
||||||
|
# 使用方法:
|
||||||
|
# 1. 将本文件复制到 /etc/nginx/sites-available/ai-chat
|
||||||
|
# 2. 创建软链接:ln -s /etc/nginx/sites-available/ai-chat /etc/nginx/sites-enabled/
|
||||||
|
# 3. 修改下方 server_name 和 root 为实际值
|
||||||
|
# 4. 如 PHP 版本非 8.0,需将 php-cgi-80 改为对应版本号
|
||||||
|
# 5. nginx -t 测试配置,nginx -s reload 重载生效
|
||||||
|
#
|
||||||
|
# 注意:
|
||||||
|
# 如果你使用宝塔面板,请勿使用本文件,改用 baota-nginx-snippet.conf(伪静态规则)
|
||||||
#
|
#
|
||||||
# 前置条件:
|
# 前置条件:
|
||||||
# - PHP 8.0+ 已安装并启用 PHP-FPM
|
# - PHP 8.0+ 已安装并启用 PHP-FPM
|
||||||
# - MySQL 5.7+ 已安装
|
# - MySQL 5.7+ 已安装
|
||||||
# - Composer 已安装
|
# - Composer 已安装
|
||||||
# - 项目已部署到 /path/to/ai-chat/ 目录
|
# - 项目已部署到服务器目录
|
||||||
|
#
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
|
|||||||
@@ -97,18 +97,27 @@ const ChatManager = {
|
|||||||
|
|
||||||
// 清除文件
|
// 清除文件
|
||||||
UploadManager.clearFiles();
|
UploadManager.clearFiles();
|
||||||
|
|
||||||
// 获取当前配置
|
// 获取当前配置
|
||||||
const provider = document.getElementById('providerSelect')?.value || 'newapi';
|
const provider = document.getElementById('providerSelect')?.value || 'newapi';
|
||||||
const model = document.getElementById('modelSelect')?.value || 'gpt-3.5-turbo';
|
const model = document.getElementById('modelSelect')?.value || 'gpt-3.5-turbo';
|
||||||
const thinkingMode = document.getElementById('thinkingMode')?.checked || false;
|
const thinkingMode = document.getElementById('thinkingMode')?.checked || false;
|
||||||
|
|
||||||
|
// 获取人格提示词
|
||||||
|
let systemPrompt = '';
|
||||||
|
const personalitySelect = document.getElementById('personalitySelect');
|
||||||
|
if (personalitySelect && personalitySelect.value) {
|
||||||
|
const personality = personalitiesData.find(p => p.id == personalitySelect.value);
|
||||||
|
if (personality) {
|
||||||
|
systemPrompt = personality.prompt || '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SSE 流式请求
|
// SSE 流式请求
|
||||||
this.isStreaming = true;
|
this.isStreaming = true;
|
||||||
this.updateSendButton();
|
this.updateSendButton();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.streamChat(provider, model, thinkingMode);
|
await this.streamChat(provider, model, thinkingMode, systemPrompt);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.addErrorMessage(err.message);
|
this.addErrorMessage(err.message);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -117,7 +126,7 @@ const ChatManager = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async streamChat(provider, model, thinkingMode) {
|
async streamChat(provider, model, thinkingMode, systemPrompt) {
|
||||||
const token = Storage.getToken();
|
const token = Storage.getToken();
|
||||||
|
|
||||||
// 构建消息历史(只取 role 和 content)
|
// 构建消息历史(只取 role 和 content)
|
||||||
@@ -138,7 +147,8 @@ const ChatManager = {
|
|||||||
'Authorization': 'Bearer ' + token
|
'Authorization': 'Bearer ' + token
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
provider, model, messages, stream: true, thinkingMode
|
provider, model, messages, stream: true, thinkingMode,
|
||||||
|
systemPrompt: systemPrompt || ''
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -158,8 +158,10 @@ const InstallWizard = {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
if (providers.length === 0 || !providers[0].name || !providers[0].apiKey) {
|
// 供应商配置可选,跳过不完整的条目
|
||||||
alert('请至少配置一个完整的供应商');
|
const validProviders = providers.filter(p => p.name && p.apiKey);
|
||||||
|
if (validProviders.length === 0 && providers.length > 0) {
|
||||||
|
alert('供应商信息不完整,请填写名称和 API Key,或删除该条目');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +182,7 @@ const InstallWizard = {
|
|||||||
jwtSecret: document.getElementById('jwtSecret').value || undefined,
|
jwtSecret: document.getElementById('jwtSecret').value || undefined,
|
||||||
jwtExpiry: parseInt(document.getElementById('jwtExpiry').value) || 86400
|
jwtExpiry: parseInt(document.getElementById('jwtExpiry').value) || 86400
|
||||||
},
|
},
|
||||||
providers: providers
|
providers: validProviders.length > 0 ? validProviders : []
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ $envChecks = json_encode([
|
|||||||
<div class="step-content" id="step2">
|
<div class="step-content" id="step2">
|
||||||
<div class="step-header">
|
<div class="step-header">
|
||||||
<h2>数据库配置</h2>
|
<h2>数据库配置</h2>
|
||||||
<p class="step-desc">填写 MySQL 数据库连接信息</p>
|
<p class="step-desc">填写 MySQL 数据库连接信息。请确保数据库已提前创建。</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-group col-flex-2">
|
<div class="form-group col-flex-2">
|
||||||
@@ -175,7 +175,7 @@ $envChecks = json_encode([
|
|||||||
<div class="step-content" id="step5">
|
<div class="step-content" id="step5">
|
||||||
<div class="step-header">
|
<div class="step-header">
|
||||||
<h2>AI 供应商配置</h2>
|
<h2>AI 供应商配置</h2>
|
||||||
<p class="step-desc">至少配置一个 AI 供应商,安装后可在设置中添加更多</p>
|
<p class="step-desc">可选步骤。现在配置或安装后在设置页面中添加</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="providerList">
|
<div id="providerList">
|
||||||
<!-- 由 JS 动态管理 -->
|
<!-- 由 JS 动态管理 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user