nex_design/DEPLOYMENT.md

471 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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