ai_learn_node/DOCKER_DEPLOY.md
caoyuchun be1dab20e9 feat: 添加 Jenkins Docker 部署配置
- 添加 Jenkinsfile 和 Jenkinsfile.docker 支持 Docker 构建
- 添加 Docker Compose 生产环境配置
- 添加后端 Dockerfile
- 添加 Docker 部署脚本
- 添加部署文档 (JENKINS_DEPLOY.md, DOCKER_DEPLOY.md, DOCKER_ISOLATION.md)
- 更新 nginx 配置支持生产环境部署
2026-01-14 14:33:58 +08:00

269 lines
5.9 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.

# Docker 部署说明
本文档说明如何在已有 Docker nginx 运行的服务器上部署本项目,避免端口和资源冲突。
## 部署架构
- **前端 Nginx**: 运行在 `8080` 端口(避免与现有 nginx 的 80 端口冲突)
- **后端服务**: 运行在 `3001` 端口
- **部署路径**: `/opt/nginx/html/ai/current`
- **容器名称**:
- `ai-learning-nginx` (前端)
- `ai-learning-backend` (后端)
## 避免冲突的设计
### 1. 端口隔离
- 现有 nginx: `80:80`, `443:443`
- 本项目 nginx: `8080:80`, `8443:443`
- 后端: `3001:3001`
### 2. 路径隔离
- 使用独立的部署路径: `/opt/nginx/html/ai/current`
- 独立的日志目录: `/opt/nginx/html/ai/current/docker/logs`
- 独立的配置文件: `/opt/nginx/html/ai/current/docker/`
### 3. 容器名称隔离
- 使用唯一的容器名称,避免与现有容器冲突
### 4. Docker 网络隔离
- 使用独立的 Docker 网络: `ai-learning-network`
## 文件结构
部署后的目录结构:
```
/opt/nginx/html/ai/current/
├── index.html # 前端入口文件
├── assets/ # 前端静态资源
├── backend/ # 后端文件
│ ├── dist/ # 后端构建产物
│ ├── prisma/ # 数据库文件
│ ├── Dockerfile # 后端 Dockerfile
│ └── package.json
└── docker/ # Docker 配置
├── docker-compose.yml
├── nginx.conf.docker
└── logs/ # Nginx 日志
```
## 部署步骤
### 1. 通过 Jenkins 自动部署
Jenkins 流水线会自动:
1. 构建前端和后端
2. 打包部署文件
3. 传输到远程服务器
4. 解压并部署
5. 启动 Docker 容器
### 2. 手动部署
如果需要手动部署:
```bash
# 1. 构建项目
npm install
npm run install:all
npm run build
# 2. 创建部署目录
ssh root@180.76.180.105 "mkdir -p /opt/nginx/html/ai/current"
# 3. 传输文件
scp -r frontend/dist/* root@180.76.180.105:/opt/nginx/html/ai/current/
scp -r backend/dist backend/prisma backend/package.json backend/Dockerfile root@180.76.180.105:/opt/nginx/html/ai/current/backend/
scp nginx/docker-compose.production.yml root@180.76.180.105:/opt/nginx/html/ai/current/docker/docker-compose.yml
scp nginx/nginx.conf.docker root@180.76.180.105:/opt/nginx/html/ai/current/docker/nginx.conf.docker
# 4. 在服务器上启动
ssh root@180.76.180.105 << 'ENDSSH'
cd /opt/nginx/html/ai/current/docker
docker-compose up -d --build
ENDSSH
```
## 访问地址
- **前端**: http://180.76.180.105:8080
- **后端 API**: http://180.76.180.105:3001
- **健康检查**: http://180.76.180.105:8080/health
## 常用命令
### 查看容器状态
```bash
cd /opt/nginx/html/ai/current/docker
docker-compose ps
```
### 查看日志
```bash
# 查看所有服务日志
docker-compose logs -f
# 查看 nginx 日志
docker-compose logs -f nginx
# 查看后端日志
docker-compose logs -f backend
```
### 重启服务
```bash
cd /opt/nginx/html/ai/current/docker
docker-compose restart
```
### 停止服务
```bash
cd /opt/nginx/html/ai/current/docker
docker-compose down
```
### 重新构建并启动
```bash
cd /opt/nginx/html/ai/current/docker
docker-compose up -d --build
```
## 故障排查
### 1. 端口冲突
如果 8080 端口被占用:
```bash
# 检查端口占用
netstat -tulpn | grep 8080
# 或
lsof -i :8080
# 修改 docker-compose.yml 中的端口映射
# 例如改为 8081:80
```
### 2. 容器无法启动
```bash
# 查看容器日志
docker-compose logs
# 检查容器状态
docker ps -a | grep ai-learning
# 检查 Docker 网络
docker network ls
```
### 3. 前端无法访问
```bash
# 检查 nginx 容器是否运行
docker ps | grep ai-learning-nginx
# 检查 nginx 配置
docker exec ai-learning-nginx nginx -t
# 查看 nginx 日志
docker-compose logs nginx
```
### 4. 后端 API 无法访问
```bash
# 检查后端容器是否运行
docker ps | grep ai-learning-backend
# 检查后端日志
docker-compose logs backend
# 测试后端连接
curl http://localhost:3001/api/health
```
### 5. 数据库问题
```bash
# 检查数据库文件权限
ls -la /opt/nginx/html/ai/current/backend/prisma/
# 进入后端容器执行迁移
docker exec -it ai-learning-backend sh
npx prisma migrate deploy
npx prisma generate
```
## 与现有 nginx 集成(可选)
如果希望通过现有 nginx80 端口)访问本项目,可以在现有 nginx 配置中添加反向代理:
```nginx
# 添加到现有 nginx 配置
location /ai/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /ai/api/ {
proxy_pass http://localhost:3001/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
```
然后访问:`http://180.76.180.105/ai/`
## 更新部署
每次代码更新后Jenkins 会自动:
1. 构建新版本
2. 备份旧版本到 `/opt/nginx/html/ai/backup-YYYYMMDD-HHMMSS`
3. 部署新版本
4. 重启 Docker 容器
## 回滚
如果需要回滚到之前的版本:
```bash
ssh root@180.76.180.105 << 'ENDSSH'
cd /opt/nginx/html/ai
# 查看备份
ls -la backup-*
# 停止当前容器
cd current/docker
docker-compose down
# 恢复备份
cd /opt/nginx/html/ai
mv current current-failed
mv backup-YYYYMMDD-HHMMSS current
# 重启服务
cd current/docker
docker-compose up -d
ENDSSH
```
## 安全建议
1. **不要使用 root 用户**: 建议创建专用部署用户
2. **限制端口访问**: 使用防火墙限制 8080 端口的访问来源
3. **定期备份**: 自动备份数据库和配置文件
4. **监控日志**: 设置日志监控和告警
5. **更新镜像**: 定期更新 nginx:alpine 和 node:18-alpine 镜像