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 部署
|