v 0.1.1
parent
3665022575
commit
cf49bcf013
|
|
@ -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
|
||||
|
|
@ -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 部署
|
||||
|
|
@ -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"]
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue