main
mula.liu 2025-11-05 15:18:52 +08:00
parent 3665022575
commit cf49bcf013
5 changed files with 606 additions and 0 deletions

46
.dockerignore 100644
View File

@ -0,0 +1,46 @@
# 依赖目录
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
# 开发文件
.git
.gitignore
.eslintrc.cjs
.DS_Store
# 构建产物(在多阶段构建中已处理)
dist
# 文档
README.md
docs
# IDE 配置
.vscode
.idea
*.swp
*.swo
.claude
# 测试文件
coverage
.nyc_output
# 环境变量
.env
.env.local
.env.development
.env.test
.env.production
# 临时文件
*.log
logs
*.tmp
*.temp
# PM2
.pm2

470
DEPLOYMENT.md 100644
View File

@ -0,0 +1,470 @@
# 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 部署

38
Dockerfile 100644
View File

@ -0,0 +1,38 @@
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
# 复制 package 文件
COPY package*.json ./
COPY yarn.lock ./
# 安装依赖
RUN yarn install --frozen-lockfile
# 复制源代码
COPY . .
# 构建项目
RUN yarn build
# 生产阶段
FROM node:18-alpine
WORKDIR /app
# 安装 PM2 和 serve
RUN npm install -g pm2 serve
# 从构建阶段复制构建产物
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/ecosystem.config.js ./ecosystem.config.js
# 创建日志目录
RUN mkdir -p logs
# 暴露端口
EXPOSE 3000
# 使用 PM2 启动应用
CMD ["pm2-runtime", "start", "ecosystem.config.js"]

27
docker-compose.yml 100644
View File

@ -0,0 +1,27 @@
version: '3.8'
services:
nex-design:
build:
context: .
dockerfile: Dockerfile
container_name: nex-design-app
restart: unless-stopped
ports:
- "3000:3000"
environment:
- NODE_ENV=production
volumes:
- ./logs:/app/logs
networks:
- nex-network
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
nex-network:
driver: bridge

View File

@ -0,0 +1,25 @@
module.exports = {
apps: [
{
name: 'nex-design',
script: 'npx',
args: 'serve -s dist -l 3000',
instances: 1,
exec_mode: 'fork',
autorestart: true,
watch: false,
max_memory_restart: '500M',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/pm2-error.log',
out_file: './logs/pm2-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true,
min_uptime: '10s',
max_restarts: 10,
restart_delay: 4000
}
]
}