269 lines
5.9 KiB
Markdown
269 lines
5.9 KiB
Markdown
|
|
# 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 集成(可选)
|
|||
|
|
|
|||
|
|
如果希望通过现有 nginx(80 端口)访问本项目,可以在现有 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 镜像
|