EternalAI/docs/deployment.md

6.7 KiB
Raw Permalink Blame History

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 准备服务器

在目标服务器上执行以下操作。

# 克隆代码仓库
cd /opt  # 或你选择的部署目录
git clone http://gitea.fischerai.cn/chigulong/eternalai.git
cd eternalai

1.2 运行服务器初始化脚本

bash deploy/setup-server.sh

此脚本会自动完成:

  • 检测并安装 Node.js 20 LTS如缺失
  • 检测并安装 PostgreSQL 15如缺失
  • 检测并安装 PM2如缺失
  • 检测并安装 Nginx如缺失
  • 创建数据库 eternalai 和用户
  • 自动生成 .env 文件(含随机 JWT 密钥和数据库密码)
  • 安装 npm 依赖
  • 生成 Prisma Client
  • 推送数据库 Schema
  • 启动 PM2 进程并配置开机自启

自定义数据库配置(可选):

DB_NAME=mydb DB_USER=myuser DB_PASS=mypassword bash deploy/setup-server.sh

脚本完成后会输出数据库密码,请妥善保存。

1.3 配置 Nginx 反向代理

# 复制 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推荐

# 安装 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 验证部署

# 检查 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

# 在服务器上注册 runner如尚未注册
# 参考 Gitea 官方文档: https://docs.gitea.com/usage/actions/quickstart

2.3 自动部署流程

每次推送代码到 master 分支时Gitea Actions 会自动:

  1. 拉取最新代码
  2. 安装 npm 依赖
  3. 生成 Prisma Client
  4. 推送数据库 Schemaprisma db push
  5. 重启 PM2 进程(pm2 reload
  6. 健康检查(等待 HTTP 200
  7. 重载 Nginx
# 推送代码触发自动部署
git push origin master

2.4 手动触发部署

在 Gitea 仓库 → Actions 页面,可手动触发 Deploy EternalAI 工作流。


三、手动部署(不使用 CI/CD

# SSH 登录服务器
ssh user@your-server

# 进入应用目录
cd /opt/eternalai

# 运行部署脚本
bash deploy/deploy.sh

部署脚本会自动完成:拉取代码 → 安装依赖 → 数据库迁移 → 重启 PM2 → 健康检查。


四、常用运维命令

PM2 进程管理

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                     # 监控面板

数据库操作

# 推送 Schema 变更
npx prisma db push

# 打开 Prisma Studio数据库可视化管理
npx prisma studio

# 连接 PostgreSQL
psql -U eternalai -d eternalai -h localhost

Nginx 操作

sudo nginx -t                 # 测试配置
sudo nginx -s reload          # 重载配置
sudo systemctl status nginx   # 查看状态
sudo tail -f /var/log/nginx/eternalai_error.log  # 查看错误日志

日志查看

# 应用日志
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 日常更新(代码变更)

# 方法一:推送代码触发 CI/CD推荐
git push origin master

# 方法二:手动部署
bash deploy/deploy.sh

5.2 数据库 Schema 变更

修改 prisma/schema.prisma 后:

# 推送到 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 环境变量变更

# 编辑 .env 文件
nano .env

# 重启应用使配置生效
pm2 reload eternalai --update-env

六、回滚

# 查看部署历史
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

七、故障排查

应用无法启动

# 查看错误日志
pm2 logs eternalai --err --lines 50

# 常见原因:
# 1. .env 文件缺失 → 运行 deploy/setup-server.sh
# 2. 数据库连接失败 → 检查 DATABASE_URL 和 PostgreSQL 服务
# 3. 端口被占用 → 检查 PORT 环境变量

数据库连接失败

# 检查 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

# 检查 Node.js 进程是否运行
pm2 status

# 检查端口
curl http://localhost:3001

# 检查 Nginx 错误日志
sudo tail -f /var/log/nginx/eternalai_error.log

PM2 进程未开机自启

# 重新配置开机自启
pm2 startup systemd
# 执行输出的 sudo 命令
pm2 save