8.6 KiB
8.6 KiB
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 镜像不包含文档,体积更小
- ✅ 灵活部署:可以独立管理文档版本
配置方式:
# 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)
# 检查 Docker 版本
docker --version
docker-compose --version
1. 上传代码到服务器
# 方式一:使用 git
git clone <your-repository-url>
cd nex-design
# 方式二:使用 scp
scp -r ./nex-design user@server:/path/to/deploy/
2. 构建 Docker 镜像
# 构建镜像
docker-compose build
# 或使用 Docker 直接构建
docker build -t nex-design:latest .
3. 启动服务
# 启动服务(后台运行)
docker-compose up -d
# 查看日志
docker-compose logs -f
# 查看服务状态
docker-compose ps
4. 验证部署
# 检查容器状态
docker ps
# 检查健康状态
docker inspect --format='{{.State.Health.Status}}' nex-design-app
# 访问应用
curl http://localhost:3000
浏览器访问: http://your-server-ip:3000
常用命令
Docker Compose 命令
# 启动服务
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 命令
# 查看运行中的容器
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 命令(容器内)
# 进入容器
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:
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 证书
# 使用 Let's Encrypt
sudo certbot --nginx -d your-domain.com
3. 修改 docker-compose.yml 添加 Nginx
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 文件:
NODE_ENV=production
PORT=3000
修改 docker-compose.yml:
services:
nex-design:
env_file:
- .env
日志管理
查看日志
# 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:
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. 资源监控
# 查看容器资源使用
docker stats nex-design-app
# 查看 PM2 监控
docker exec nex-design-app pm2 monit
2. 健康检查
# 检查健康状态
docker inspect --format='{{json .State.Health}}' nex-design-app | jq
3. 自动更新部署
创建 deploy.sh:
#!/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"
赋予执行权限:
chmod +x deploy.sh
故障排查
容器无法启动
# 查看详细错误
docker-compose logs nex-design
# 检查镜像是否构建成功
docker images | grep nex-design
# 检查端口占用
netstat -tlnp | grep 3000
PM2 进程异常
# 进入容器
docker exec -it nex-design-app sh
# 查看 PM2 状态
pm2 status
# 重启进程
pm2 restart nex-design
# 查看错误日志
pm2 logs --err
内存占用过高
# 查看内存使用
docker stats nex-design-app
# 调整 PM2 内存限制
# 修改 ecosystem.config.js 中的 max_memory_restart
备份与恢复
备份
# 备份日志
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
恢复
# 恢复配置
tar -xzf config-backup-20250101.tar.gz
# 重新部署
docker-compose up -d --build
安全建议
- 最小权限原则: 使用非 root 用户运行容器
- 定期更新: 及时更新基础镜像和依赖包
- 网络隔离: 使用 Docker 网络隔离服务
- 日志审计: 定期检查日志文件
- 资源限制: 在 docker-compose.yml 中添加资源限制
services:
nex-design:
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
memory: 256M
性能优化
- 启用 Gzip 压缩: 在 Nginx 中配置
- 静态资源缓存: 设置合理的缓存策略
- CDN 加速: 将静态资源托管到 CDN
- 镜像优化: 使用 Alpine 基础镜像,减小体积
- 构建缓存: 利用 Docker 层缓存加速构建
技术支持
如遇问题,请检查:
- Docker 和 Docker Compose 版本
- 服务器资源(CPU、内存、磁盘)
- 防火墙和端口配置
- 日志文件中的错误信息
更新日志
- v1.0.0 (2025-11-05): 初始版本,支持 Docker + PM2 部署