494 lines
8.6 KiB
Markdown
494 lines
8.6 KiB
Markdown
# Nex Design 部署文档
|
||
|
||
## 概述
|
||
|
||
本文档介绍如何使用 Docker + PM2 在服务器上部署 Nex Design 项目。
|
||
|
||
## 技术栈
|
||
|
||
- Docker: 容器化部署
|
||
- PM2: Node.js 进程管理
|
||
- Nginx serve: 静态文件服务器
|
||
- Node.js 18: 运行环境
|
||
|
||
## 项目构建说明
|
||
|
||
### 文档目录处理
|
||
|
||
本项目的 `/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 目录
|
||
|
||
## 文件说明
|
||
|
||
### 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 部署
|