nex_design/DEPLOYMENT.md

8.6 KiB
Raw Permalink Blame History

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

安全建议

  1. 最小权限原则: 使用非 root 用户运行容器
  2. 定期更新: 及时更新基础镜像和依赖包
  3. 网络隔离: 使用 Docker 网络隔离服务
  4. 日志审计: 定期检查日志文件
  5. 资源限制: 在 docker-compose.yml 中添加资源限制
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 部署