nex_design/DEPLOYMENT.md

494 lines
8.6 KiB
Markdown
Raw Normal View History

2025-11-05 07:18:52 +00:00
# Nex Design 部署文档
## 概述
本文档介绍如何使用 Docker + PM2 在服务器上部署 Nex Design 项目。
## 技术栈
- Docker: 容器化部署
- PM2: Node.js 进程管理
- Nginx serve: 静态文件服务器
- Node.js 18: 运行环境
2025-11-13 10:11:08 +00:00
## 项目构建说明
### 文档目录处理
本项目的 `/design` 路由会加载项目根目录下的 `docs/` 文件夹中的 Markdown 文档。通过 Docker 卷挂载方式,将宿主机的 `docs/` 目录映射到容器内的 `/app/dist/docs/`
**优势:**
- ✅ 实时更新:修改 MD 文件后无需重新构建镜像
- ✅ 方便维护:在宿主机直接编辑文档
- ✅ 轻量镜像Docker 镜像不包含文档,体积更小
- ✅ 灵活部署:可以独立管理文档版本
**配置方式:**
```yaml
# docker-compose.yml
volumes:
- ./docs:/app/dist/docs:ro # :ro 表示只读挂载,提高安全性
```
**注意事项:**
- 部署时需要确保 `docs/` 目录存在于项目根目录
- 如需制作完全自包含的镜像,可以在 Dockerfile 中 COPY docs 目录
2025-11-05 07:18:52 +00:00
## 文件说明
### 1. ecosystem.config.js
PM2 进程管理配置文件,定义了应用的运行参数:
- **name**: 应用名称 `nex-design`
- **script**: 使用 `npx serve` 提供静态文件服务
- **args**: 指定服务 `dist` 目录,端口 3000
- **instances**: 单实例运行
- **max_memory_restart**: 内存超过 500MB 自动重启
- **日志配置**: 输出到 `logs` 目录
### 2. Dockerfile
多阶段构建的 Docker 镜像配置:
**构建阶段 (builder)**:
- 基于 `node:18-alpine`
- 安装依赖并构建项目
**生产阶段**:
- 轻量级 Alpine 镜像
- 全局安装 PM2 和 serve
- 复制构建产物和配置
- 暴露 3000 端口
- 使用 `pm2-runtime` 启动
### 3. docker-compose.yml
Docker Compose 编排配置:
- 服务名称: `nex-design`
- 端口映射: `3000:3000`
- 自动重启策略
- 日志卷挂载
- 健康检查配置
### 4. .dockerignore
定义 Docker 构建时忽略的文件,减小镜像体积。
## 部署步骤
### 前置要求
确保服务器已安装:
- Docker (>= 20.10)
- Docker Compose (>= 2.0)
```bash
# 检查 Docker 版本
docker --version
docker-compose --version
```
### 1. 上传代码到服务器
```bash
# 方式一:使用 git
git clone <your-repository-url>
cd nex-design
# 方式二:使用 scp
scp -r ./nex-design user@server:/path/to/deploy/
```
### 2. 构建 Docker 镜像
```bash
# 构建镜像
docker-compose build
# 或使用 Docker 直接构建
docker build -t nex-design:latest .
```
### 3. 启动服务
```bash
# 启动服务(后台运行)
docker-compose up -d
# 查看日志
docker-compose logs -f
# 查看服务状态
docker-compose ps
```
### 4. 验证部署
```bash
# 检查容器状态
docker ps
# 检查健康状态
docker inspect --format='{{.State.Health.Status}}' nex-design-app
# 访问应用
curl http://localhost:3000
```
浏览器访问: `http://your-server-ip:3000`
## 常用命令
### Docker Compose 命令
```bash
# 启动服务
docker-compose up -d
# 停止服务
docker-compose stop
# 重启服务
docker-compose restart
# 停止并删除容器
docker-compose down
# 查看日志
docker-compose logs -f nex-design
# 重新构建并启动
docker-compose up -d --build
```
### Docker 命令
```bash
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 进入容器
docker exec -it nex-design-app sh
# 查看容器日志
docker logs -f nex-design-app
# 删除容器
docker rm -f nex-design-app
# 删除镜像
docker rmi nex-design:latest
```
### PM2 命令(容器内)
```bash
# 进入容器
docker exec -it nex-design-app sh
# 查看 PM2 进程列表
pm2 list
# 查看日志
pm2 logs
# 查看监控信息
pm2 monit
# 重启应用
pm2 restart nex-design
# 查看详细信息
pm2 show nex-design
```
## 生产环境优化
### 1. 使用 Nginx 反向代理
创建 `nginx.conf`:
```nginx
upstream nex_design {
server localhost:3000;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://nex_design;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
proxy_pass http://nex_design;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
```
### 2. 添加 SSL 证书
```bash
# 使用 Let's Encrypt
sudo certbot --nginx -d your-domain.com
```
### 3. 修改 docker-compose.yml 添加 Nginx
```yaml
version: '3.8'
services:
nex-design:
build:
context: .
dockerfile: Dockerfile
container_name: nex-design-app
restart: unless-stopped
expose:
- "3000"
environment:
- NODE_ENV=production
volumes:
- ./logs:/app/logs
networks:
- nex-network
nginx:
image: nginx:alpine
container_name: nex-design-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- nex-design
networks:
- nex-network
networks:
nex-network:
driver: bridge
```
### 4. 环境变量配置
创建 `.env` 文件:
```env
NODE_ENV=production
PORT=3000
```
修改 `docker-compose.yml`:
```yaml
services:
nex-design:
env_file:
- .env
```
## 日志管理
### 查看日志
```bash
# Docker 日志
docker-compose logs -f --tail=100 nex-design
# PM2 日志(在容器内)
docker exec nex-design-app pm2 logs --lines 100
# 宿主机日志文件
tail -f ./logs/pm2-out.log
tail -f ./logs/pm2-error.log
```
### 日志轮转
安装 `pm2-logrotate`:
```bash
docker exec nex-design-app pm2 install pm2-logrotate
docker exec nex-design-app pm2 set pm2-logrotate:max_size 10M
docker exec nex-design-app pm2 set pm2-logrotate:retain 7
```
## 监控和维护
### 1. 资源监控
```bash
# 查看容器资源使用
docker stats nex-design-app
# 查看 PM2 监控
docker exec nex-design-app pm2 monit
```
### 2. 健康检查
```bash
# 检查健康状态
docker inspect --format='{{json .State.Health}}' nex-design-app | jq
```
### 3. 自动更新部署
创建 `deploy.sh`:
```bash
#!/bin/bash
echo "开始部署 Nex Design..."
# 拉取最新代码
git pull origin main
# 重新构建镜像
docker-compose build
# 重启服务
docker-compose up -d
# 清理旧镜像
docker image prune -f
echo "部署完成!"
echo "查看日志: docker-compose logs -f"
```
赋予执行权限:
```bash
chmod +x deploy.sh
```
## 故障排查
### 容器无法启动
```bash
# 查看详细错误
docker-compose logs nex-design
# 检查镜像是否构建成功
docker images | grep nex-design
# 检查端口占用
netstat -tlnp | grep 3000
```
### PM2 进程异常
```bash
# 进入容器
docker exec -it nex-design-app sh
# 查看 PM2 状态
pm2 status
# 重启进程
pm2 restart nex-design
# 查看错误日志
pm2 logs --err
```
### 内存占用过高
```bash
# 查看内存使用
docker stats nex-design-app
# 调整 PM2 内存限制
# 修改 ecosystem.config.js 中的 max_memory_restart
```
## 备份与恢复
### 备份
```bash
# 备份日志
tar -czf logs-backup-$(date +%Y%m%d).tar.gz logs/
# 备份配置
tar -czf config-backup-$(date +%Y%m%d).tar.gz \
ecosystem.config.js \
Dockerfile \
docker-compose.yml \
.dockerignore
```
### 恢复
```bash
# 恢复配置
tar -xzf config-backup-20250101.tar.gz
# 重新部署
docker-compose up -d --build
```
## 安全建议
1. **最小权限原则**: 使用非 root 用户运行容器
2. **定期更新**: 及时更新基础镜像和依赖包
3. **网络隔离**: 使用 Docker 网络隔离服务
4. **日志审计**: 定期检查日志文件
5. **资源限制**: 在 docker-compose.yml 中添加资源限制
```yaml
services:
nex-design:
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
memory: 256M
```
## 性能优化
1. **启用 Gzip 压缩**: 在 Nginx 中配置
2. **静态资源缓存**: 设置合理的缓存策略
3. **CDN 加速**: 将静态资源托管到 CDN
4. **镜像优化**: 使用 Alpine 基础镜像,减小体积
5. **构建缓存**: 利用 Docker 层缓存加速构建
## 技术支持
如遇问题,请检查:
1. Docker 和 Docker Compose 版本
2. 服务器资源CPU、内存、磁盘
3. 防火墙和端口配置
4. 日志文件中的错误信息
## 更新日志
- **v1.0.0** (2025-11-05): 初始版本,支持 Docker + PM2 部署