EternalAI/docs/deployment.md

333 lines
6.7 KiB
Markdown
Raw 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.

# EternalAI 部署指南
## 架构概览
```
用户浏览器 → Nginx (80/443) → Node.js Express (3001) → PostgreSQL (5432)
PM2 进程管理
```
## 文件清单
| 文件 | 用途 |
|------|------|
| `ecosystem.config.js` | PM2 进程配置 |
| `.env.example` | 环境变量模板 |
| `deploy/setup-server.sh` | 首次服务器初始化脚本 |
| `deploy/deploy.sh` | 每次部署脚本 |
| `deploy/nginx.conf` | Nginx 反向代理配置模板 |
| `.gitea/workflows/deploy.yml` | Gitea Actions CI/CD 工作流 |
---
## 一、首次部署(全量部署)
### 1.1 准备服务器
在目标服务器上执行以下操作。
```bash
# 克隆代码仓库
cd /opt # 或你选择的部署目录
git clone http://gitea.fischerai.cn/chigulong/eternalai.git
cd eternalai
```
### 1.2 运行服务器初始化脚本
```bash
bash deploy/setup-server.sh
```
此脚本会自动完成:
- 检测并安装 Node.js 20 LTS如缺失
- 检测并安装 PostgreSQL 15如缺失
- 检测并安装 PM2如缺失
- 检测并安装 Nginx如缺失
- 创建数据库 `eternalai` 和用户
- 自动生成 `.env` 文件(含随机 JWT 密钥和数据库密码)
- 安装 npm 依赖
- 生成 Prisma Client
- 推送数据库 Schema
- 启动 PM2 进程并配置开机自启
**自定义数据库配置**(可选):
```bash
DB_NAME=mydb DB_USER=myuser DB_PASS=mypassword bash deploy/setup-server.sh
```
脚本完成后会输出数据库密码,请妥善保存。
### 1.3 配置 Nginx 反向代理
```bash
# 复制 Nginx 配置
sudo cp deploy/nginx.conf /etc/nginx/sites-available/eternalai
sudo ln -s /etc/nginx/sites-available/eternalai /etc/nginx/sites-enabled/
# 编辑配置,替换 YOUR_DOMAIN 为实际域名
sudo nano /etc/nginx/sites-enabled/eternalai
# 将所有 YOUR_DOMAIN 替换为你的域名,如 eternalai.example.com
# 测试配置
sudo nginx -t
# 重载 Nginx
sudo nginx -s reload
```
### 1.4 配置 HTTPS推荐
```bash
# 安装 Certbot
sudo apt-get install -y certbot python3-certbot-nginx # Ubuntu/Debian
# 或
sudo yum install -y certbot python3-certbot-nginx # CentOS/RHEL
# 自动获取并配置 SSL 证书
sudo certbot --nginx -d YOUR_DOMAIN
# 证书自动续期Certbot 会自动配置 cron
sudo certbot renew --dry-run
```
### 1.5 验证部署
```bash
# 检查 PM2 进程状态
pm2 status
# 查看应用日志
pm2 logs eternalai
# 测试本地访问
curl http://localhost:3001
# 测试 Nginx 代理访问
curl http://YOUR_DOMAIN
```
---
## 二、CI/CD 自动部署(推送即部署)
### 2.1 配置 Gitea Secrets
在 Gitea 仓库设置中添加 Secret
1. 进入仓库 → Settings → Actions → Secrets
2. 添加 `DATABASE_URL`,值为 `.env` 文件中的 `DATABASE_URL`
### 2.2 配置 Gitea Runner
确保已注册 self-hosted runner
```bash
# 在服务器上注册 runner如尚未注册
# 参考 Gitea 官方文档: https://docs.gitea.com/usage/actions/quickstart
```
### 2.3 自动部署流程
每次推送代码到 `master` 分支时Gitea Actions 会自动:
1. 拉取最新代码
2. 安装 npm 依赖
3. 生成 Prisma Client
4. 推送数据库 Schema`prisma db push`
5. 重启 PM2 进程(`pm2 reload`
6. 健康检查(等待 HTTP 200
7. 重载 Nginx
```bash
# 推送代码触发自动部署
git push origin master
```
### 2.4 手动触发部署
在 Gitea 仓库 → Actions 页面,可手动触发 `Deploy EternalAI` 工作流。
---
## 三、手动部署(不使用 CI/CD
```bash
# SSH 登录服务器
ssh user@your-server
# 进入应用目录
cd /opt/eternalai
# 运行部署脚本
bash deploy/deploy.sh
```
部署脚本会自动完成:拉取代码 → 安装依赖 → 数据库迁移 → 重启 PM2 → 健康检查。
---
## 四、常用运维命令
### PM2 进程管理
```bash
pm2 status # 查看进程状态
pm2 logs eternalai # 实时查看日志
pm2 logs eternalai --lines 100 # 查看最近 100 行日志
pm2 restart eternalai # 重启进程
pm2 reload eternalai # 零停机重载
pm2 stop eternalai # 停止进程
pm2 delete eternalai # 删除进程
pm2 monit # 监控面板
```
### 数据库操作
```bash
# 推送 Schema 变更
npx prisma db push
# 打开 Prisma Studio数据库可视化管理
npx prisma studio
# 连接 PostgreSQL
psql -U eternalai -d eternalai -h localhost
```
### Nginx 操作
```bash
sudo nginx -t # 测试配置
sudo nginx -s reload # 重载配置
sudo systemctl status nginx # 查看状态
sudo tail -f /var/log/nginx/eternalai_error.log # 查看错误日志
```
### 日志查看
```bash
# 应用日志
tail -f logs/out.log # 标准输出
tail -f logs/err.log # 错误输出
# Nginx 日志
sudo tail -f /var/log/nginx/eternalai_access.log
sudo tail -f /var/log/nginx/eternalai_error.log
# PostgreSQL 日志
sudo tail -f /var/log/postgresql/postgresql-15-main.log
```
---
## 五、更新部署
### 5.1 日常更新(代码变更)
```bash
# 方法一:推送代码触发 CI/CD推荐
git push origin master
# 方法二:手动部署
bash deploy/deploy.sh
```
### 5.2 数据库 Schema 变更
修改 `prisma/schema.prisma` 后:
```bash
# 推送到 masterCI/CD 会自动执行 prisma db push
git add prisma/schema.prisma
git commit -m "feat: update schema"
git push origin master
# 或手动执行
npx prisma db push
pm2 reload eternalai
```
### 5.3 环境变量变更
```bash
# 编辑 .env 文件
nano .env
# 重启应用使配置生效
pm2 reload eternalai --update-env
```
---
## 六、回滚
```bash
# 查看部署历史
git log --oneline -10
# 回滚到指定版本
git checkout <commit-hash>
npm install
npx prisma db push
pm2 reload eternalai
# 或回滚到上一个版本
git checkout HEAD~1
npm install
npx prisma db push
pm2 reload eternalai
```
---
## 七、故障排查
### 应用无法启动
```bash
# 查看错误日志
pm2 logs eternalai --err --lines 50
# 常见原因:
# 1. .env 文件缺失 → 运行 deploy/setup-server.sh
# 2. 数据库连接失败 → 检查 DATABASE_URL 和 PostgreSQL 服务
# 3. 端口被占用 → 检查 PORT 环境变量
```
### 数据库连接失败
```bash
# 检查 PostgreSQL 服务
sudo systemctl status postgresql
# 测试连接
psql -U eternalai -d eternalai -h localhost -W
# 检查 pg_hba.conf 认证配置
sudo cat /etc/postgresql/15/main/pg_hba.conf | grep -v '^#'
```
### Nginx 502 Bad Gateway
```bash
# 检查 Node.js 进程是否运行
pm2 status
# 检查端口
curl http://localhost:3001
# 检查 Nginx 错误日志
sudo tail -f /var/log/nginx/eternalai_error.log
```
### PM2 进程未开机自启
```bash
# 重新配置开机自启
pm2 startup systemd
# 执行输出的 sudo 命令
pm2 save
```