ai-chatbot/docs/pascal-production-deployment.md

117 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Pascal Editor 可复用生产部署
Pascal Editor 的定制源码位于主仓库 `services/pascal-editor`,以独立
Bun/Next.js 服务运行,并通过主站 Nginx 同域挂载。新服务器只需拉取
主仓库,无需再克隆或维护 Pascal 独立分支。
## 默认结构
| 项目 | 默认值 |
| --- | --- |
| 主站源码 | 当前仓库目录 |
| Pascal 内置源码 | `services/pascal-editor` |
| Pascal 运行副本 | `/opt/pascal-editor` |
| Pascal 用户数据 | `/var/lib/pascal-editor` |
| 主站 PM2 服务 | `ai-chatbot` |
| Pascal PM2 服务 | `pascal-editor` |
| Pascal 监听 | `127.0.0.1:3002` |
| 同域路径 | `/pascal-service` |
`/opt/pascal-editor` 是部署脚本生成的运行副本,不是第二个源码仓库,
不应在该目录直接修改代码。Pascal 端口不对公网开放。Nginx 先通过
`/api/internal/pascal/access` 校验主站登录 Cookie,再注入可信用户 ID。
场景数据按 `ownerId` 隔离。
## 首次部署
目标服务器部署好主站后执行:
```bash
cd /var/www/ai-chatbot
git pull --ff-only origin main
sudo env \
PASCAL_PUBLIC_ORIGIN=https://example.com \
NGINX_SITE_CONFIG=/etc/nginx/sites-enabled/example.com.conf \
pnpm pascal:deploy
```
脚本会按顺序:
1. 生成或复用 `PASCAL_PROXY_SECRET`,写入主站 `.env.local`。
2. 安装主站开发依赖,构建并重启主站。
3. 安装固定版本 Bun(默认 `1.3.0`)和 `rsync`。
4. 将 `services/pascal-editor` 同步为独立运行副本。
5. 写入仅 root 可读的 Pascal 生产环境文件。
6. 安装依赖、构建 Pascal,并注册 PM2 服务。
7. 渲染 Nginx 片段,校验成功后热重载。
8. 检查主站、Pascal、Agent 状态和主站模型网关。
主站环境文件、Nginx 配置以及旧 Pascal Git 元数据会备份到
`/var/backups/pascal-deploy`。Nginx 校验失败时会恢复原配置。
## 日常更新
以后只需更新主仓库,并重复执行部署命令:
```bash
git pull --ff-only origin main
sudo env PASCAL_PUBLIC_ORIGIN=https://example.com pnpm pascal:deploy
```
`rsync --delete` 会更新运行副本,但保留 `/opt/pascal-editor/.env.production`。
用户数据始终位于独立的 `PASCAL_DATA_DIR`,不会被代码同步覆盖。
只做无模型费用的健康检查:
```bash
sudo env PASCAL_PUBLIC_ORIGIN=https://example.com pnpm pascal:check
```
执行一次真实自然语言建模,验证节点落库后删除临时场景:
```bash
sudo env PASCAL_SMOKE_CONFIRM=1 pnpm pascal:smoke
```
真实冒烟会调用系统设置中显式标记的“多模态模型”,默认不在一键部署
时执行。需要每次部署自动执行时设置 `RUN_AGENT_SMOKE_TEST=true`。
## 常用覆盖项
| 环境变量 | 用途 |
| --- | --- |
| `MAIN_APP_DIR` | 主站源码目录 |
| `MAIN_ENV_FILE` | 主站环境文件 |
| `MAIN_PM2_NAME` | 主站 PM2 服务名 |
| `MAIN_INTERNAL_URL` | Pascal 调用主站网关的地址 |
| `MAIN_NGINX_UPSTREAM` | Nginx 主站 upstream |
| `BUILD_MAIN_APP=false` | 跳过主站安装、构建和重启 |
| `PASCAL_SOURCE_DIR` | Pascal 内置源码目录 |
| `PASCAL_INSTALL_DIR` | Pascal 运行副本目录 |
| `PASCAL_DATA_DIR` | SQLite 用户数据目录 |
| `PASCAL_PORT` | Pascal 本地监听端口 |
| `PASCAL_BASE_PATH` | 同域挂载路径 |
| `PASCAL_PUBLIC_ORIGIN` | 公网主站 Origin,不带末尾斜杠 |
| `NGINX_SITE_CONFIG` | 需加入 Pascal include 的 HTTPS server 配置 |
| `INSTALL_NGINX=false` | 仅部署服务,不修改 Nginx |
| `PASCAL_BUN_VERSION` | 固定 Bun 版本 |
| `PASCAL_BACKUP_DIR` | 环境与 Nginx 配置备份目录 |
`PASCAL_PUBLIC_ORIGIN` 会同时写入 Pascal 的场景 API 允许来源,用于正确
识别 Nginx 后的 HTTPS 同域请求,不应配置为 `*`。
## 运行维护
```bash
pm2 status
pm2 logs pascal-editor --lines 100
curl http://127.0.0.1:3002/pascal-service/api/health
cat /opt/pascal-editor/.pascal-source-version
nginx -t
```
不要将本地测试数据库放进 `services/pascal-editor`,也不要直接修改
`/opt/pascal-editor`。代码只更新主仓 `main`,用户场景只保存在
`PASCAL_DATA_DIR`。