auto-deploy-demo/README.md

755 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 快速Demo演示系统
一个简易的前端项目部署管理平台,支持快速上传、部署和运行前端演示项目。
## 功能特性
- **快速部署** - 拖拽上传文件,一键启动项目
- **多项目支持** - 同时运行多个演示项目
- **自动端口分配** - 自动分配可用端口9000-9100
- **SPA路由支持** - 自动处理前端路由刷新问题
- **安全登录** - 支持登录失败锁定机制
- **密码修改** - 用户可自行修改密码
- **域名配置** - 支持自定义域名生成项目链接
- **Nginx动态路由** - 支持Nginx反向代理统一端口访问
## 技术栈
- **后端**: Node.js + Express
- **前端**: Vue 3 + Vite + Tailwind CSS
- **状态管理**: Pinia
- **进程管理**: PM2
- **反向代理**: Nginx可选
## 环境要求
- Node.js >= 16.0.0
- npm >= 8.0.0
- 操作系统: Windows / Linux / macOS
- Nginx可选用于动态路由模式
## 运行模式
系统支持两种运行模式:
| 模式 | 说明 | URL格式 | 适用场景 |
|------|------|---------|----------|
| **多端口模式** | 每个项目独立端口 | `http://domain:9000/` | 本地开发、无Nginx环境 |
| **Nginx动态路由模式** | 所有项目共用80端口 | `http://domain/project/{id}/` | 服务器部署、生产环境 |
## 快速开始
### 安装依赖
```bash
# 安装后端依赖
npm install
# 安装前端依赖并构建
cd client
npm install
npm run build
cd ..
```
### 配置环境变量
复制配置文件并修改:
```bash
cp .env.example .env
```
编辑 `.env` 文件:
```env
# 服务端口
PORT=8888
# 基础域名(部署到服务器时配置)
BASE_DOMAIN=your-domain.com
# 项目端口范围
PROJECT_PORT_START=9000
PROJECT_PORT_END=9100
# Nginx配置动态路由模式
USE_NGINX=auto
NGINX_CONFIG_DIR=./nginx/sites-enabled
NGINX_TEMPLATE_PATH=./server/templates/nginx
NGINX_RELOAD_CMD=nginx -s reload
NGINX_TEST_CMD=nginx -t
```
### 启动服务
```bash
npm start
```
访问 http://localhost:8888 进入系统。
### 默认账号
- 用户名: `admin`
- 密码: `admin123`
---
## Windows 本地开发环境
### 方式一多端口模式无需Nginx
默认配置 `USE_NGINX=auto`系统会自动检测Nginx。本地未安装Nginx时自动使用多端口模式。
```env
# .env
USE_NGINX=false
```
启动后访问:
- 管理后台: http://localhost:8888
- 项目地址: http://localhost:9000、http://localhost:9001 等
### 方式二Nginx动态路由模式
#### 1. 安装NginxWindows
**方法A - 使用Chocolatey推荐:**
```powershell
# 安装Chocolatey如未安装
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 安装Nginx
choco install nginx
```
**方法B - 手动安装:**
1. 下载Nginx: http://nginx.org/en/download.html (选择 Stable version → nginx/Windows)
2. 解压到 `C:\nginx`
3.`C:\nginx` 添加到系统环境变量 PATH
#### 2. 配置Nginx
创建Nginx配置目录
```powershell
# 在项目目录下创建
mkdir nginx\sites-enabled
```
编辑 `C:\nginx\conf\nginx.conf`,在 http 块末尾添加:
```nginx
http {
# ... 其他配置 ...
# 引入自动生成的配置
include Q:/agentProject/auto-deploy-demo/nginx/sites-enabled/*.conf;
}
```
#### 3. 配置环境变量
```env
# .env
USE_NGINX=true
NGINX_CONFIG_DIR=./nginx/sites-enabled
NGINX_RELOAD_CMD=nginx -s reload
NGINX_TEST_CMD=nginx -t
```
#### 4. 启动服务
```powershell
# 启动Nginx
start nginx
# 启动应用
npm start
```
启动后访问:
- 管理后台: http://localhost:8888
- 项目地址: http://localhost/project/{id}/
---
## Linux 服务器部署
### 方式一:多端口模式
适用于无需Nginx或已有其他反向代理的场景。
```env
# .env
USE_NGINX=false
PORT=8888
BASE_DOMAIN=your-domain.com
```
防火墙配置:
```bash
sudo firewall-cmd --permanent --add-port=8888/tcp
sudo firewall-cmd --permanent --add-port=9000-9100/tcp
sudo firewall-cmd --reload
```
### 方式二Nginx动态路由模式推荐
#### 1. 安装Nginx
```bash
# CentOS/RHEL
sudo yum install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
# Ubuntu/Debian
sudo apt update
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
```
#### 2. 创建配置目录
```bash
# 在项目目录下创建
mkdir -p /path/to/app/nginx/sites-enabled
```
#### 3. 配置Nginx主配置
编辑 `/etc/nginx/nginx.conf`,在 http 块内添加:
```nginx
http {
# ... 其他配置 ...
# 引入自动生成的配置
include /path/to/app/nginx/sites-enabled/*.conf;
}
```
#### 4. 配置环境变量
```env
# .env
PORT=8888
BASE_DOMAIN=demo.your-domain.com
USE_NGINX=true
NGINX_CONFIG_DIR=/path/to/app/nginx/sites-enabled
NGINX_TEMPLATE_PATH=/path/to/app/server/templates/nginx
NGINX_RELOAD_CMD=sudo nginx -s reload
NGINX_TEST_CMD=sudo nginx -t
```
#### 5. 配置sudo权限重要
为了让Node.js应用能够执行nginx命令需要配置sudo免密
```bash
sudo visudo
```
添加以下内容(替换 `www-user` 为实际运行用户):
```
www-user ALL=(ALL) NOPASSWD: /usr/sbin/nginx -s reload, /usr/sbin/nginx -t
```
#### 6. 防火墙配置
```bash
# 只需开放80和443端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
```
#### 7. 启动服务
```bash
npm install --production
```
**方式A使用systemd服务推荐**
创建服务文件:
```bash
sudo nano /etc/systemd/system/auto-deploy.service
```
内容如下(修改路径和用户):
```ini
[Unit]
Description=Auto Deploy Demo
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/app
ExecStart=/usr/bin/node server/index.js
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
启动服务:
```bash
sudo systemctl daemon-reload
sudo systemctl enable auto-deploy
sudo systemctl start auto-deploy
```
**方式B使用PM2可选**
```bash
sudo npm install -g pm2
pm2 start server/index.js --name auto-deploy-demo
pm2 save
pm2 startup
```
启动后访问:
- 管理后台: http://demo.your-domain.com/
- 项目地址: http://demo.your-domain.com/project/{id}/
---
## 一键打包部署(推荐)
本地构建服务器直接运行无需在服务器上安装Node.js。
### 部署模式
| 模式 | 命令 | 端口 | 适用场景 |
|------|------|------|----------|
| **单端口模式** | `.\build-dist.ps1 -SinglePort` | 8080→80 | 宿主机有Nginx只需一个端口 |
| **多端口模式** | `.\build-dist.ps1` | 8888+9000-9100 | 宿主机无Nginx直接暴露多端口 |
### 单端口模式架构(推荐)
```
用户请求
┌─────────────────────────────────────┐
│ 宿主机 Nginx (80) │
│ demo.example.com → localhost:8080 │
└──────────────┬──────────────────────┘
┌─────────────────────────────────────┐
│ Docker 容器 (8080→80) │
│ ┌───────────────────────────────┐ │
│ │ 容器内 Nginx (80) │ │
│ │ / → 管理后台 (127.0.0.1:8888)│ │
│ │ /project/123/ → :9000 │ │
│ │ /project/456/ → :9001 │ │
│ └───────────────────────────────┘ │
│ ┌───────────────────────────────┐ │
│ │ Node.js 服务 (127.0.0.1:8888)│ │
│ │ 项目服务 (127.0.0.1:9000+) │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
```
### 本地打包
**Windows PowerShell:**
```powershell
# 单端口模式(推荐)
.\build-dist.ps1 -SinglePort
# 多端口模式
.\build-dist.ps1
```
**Linux/Mac:**
```bash
chmod +x build-dist.sh
# 单端口模式(推荐)
./build-dist.sh --single-port
# 多端口模式
./build-dist.sh
```
打包完成后会生成:
- `deploy-dist/` - 部署目录
- `auto-deploy-dist-single-YYYYMMDD_HHMMSS.zip` - 压缩包
### 服务器部署
1. **上传部署包**
```bash
scp auto-deploy-dist-*.zip user@server:/opt/auto-deploy/
```
2. **解压并启动**
```bash
cd /opt/auto-deploy
unzip auto-deploy-dist-*.zip
docker-compose up -d
```
3. **配置宿主机Nginx**
创建 `/etc/nginx/conf.d/demo.conf`:
```nginx
server {
listen 80;
server_name demo.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
重载Nginx:
```bash
sudo nginx -t && sudo nginx -s reload
```
4. **访问管理后台**
```
http://demo.example.com/
```
### 部署包结构
```
deploy-dist/
├── Dockerfile # Docker构建文件
├── docker-compose.yml # Docker编排文件
├── package.json # 依赖配置
├── server/ # 后端代码
├── client/dist/ # 前端构建产物
├── data/ # 数据目录(持久化)
├── projects/ # 项目文件(持久化)
├── .env # 环境变量
└── README.md # 部署说明
```
---
## Docker 部署(推荐)
适用于宿主机已有Nginx的场景。
### 架构说明
```
┌─────────────────────────────────────────────────────────────┐
│ 宿主机 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Nginx (80/443) │ │
│ │ location / { proxy_pass http://127.0.0.1:8888; } │ │
│ │ location /project/ { proxy_pass http://127.0.0.1:9000-9100; } │
│ └──────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────────┐ │
│ │ Docker Container │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Node.js App (8888) - 管理后台/API │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 项目服务 (9000-9100) - 演示项目 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
### 1. 构建前端
```bash
cd client
npm install
npm run build
cd ..
```
### 2. 构建Docker镜像
```bash
docker build -t auto-deploy-demo .
```
### 3. 启动容器
**方式A使用docker-compose推荐**
```bash
docker-compose up -d
```
**方式B使用docker run**
```bash
docker run -d \
--name auto-deploy-demo \
-p 8888:8888 \
-p 9000:9000 \
-p 9001:9001 \
-p 9002:9002 \
-p 9003:9003 \
-p 9004:9004 \
-p 9005:9005 \
-v $(pwd)/data:/app/data \
-v $(pwd)/projects:/app/projects \
-e BASE_DOMAIN=your-domain.com \
-e USE_NGINX=false \
-e PROJECT_BIND_ADDRESS=0.0.0.0 \
auto-deploy-demo
```
> **注意**: Docker模式下必须设置 `PROJECT_BIND_ADDRESS=0.0.0.0`,否则宿主机无法访问项目服务。
### 4. 配置宿主机Nginx
在宿主机的Nginx配置中添加
```nginx
# /etc/nginx/conf.d/auto-deploy.conf
server {
listen 80;
server_name demo.your-domain.com;
# 管理后台和API
location / {
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 每个项目使用独立子域名(推荐方案)
# 项目1: http://project1.demo.your-domain.com
server {
listen 80;
server_name project1.demo.your-domain.com;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 项目2: http://project2.demo.your-domain.com
server {
listen 80;
server_name project2.demo.your-domain.com;
location / {
proxy_pass http://127.0.0.1:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
### 5. 简化方案:直接使用端口访问
如果不需要域名,可以直接通过端口访问:
- 管理后台: http://your-server-ip:8888
- 项目1: http://your-server-ip:9000
- 项目2: http://your-server-ip:9001
### Docker常用命令
```bash
# 查看日志
docker logs -f auto-deploy-demo
# 重启容器
docker restart auto-deploy-demo
# 停止容器
docker-compose down
# 更新部署
docker-compose down
docker-compose build
docker-compose up -d
```
---
## 使用指南
### 创建项目
1. 点击右上角「新建项目」按钮
2. 填写项目名称和描述
3. 拖拽或点击上传项目文件
4. 点击「创建项目」完成
### 部署项目
1. 在项目列表点击「启动项目」
2. 系统自动分配端口并启动
3. 点击生成的链接访问项目
### 修改密码
1. 点击右上角「设置」按钮
2. 输入当前密码和新密码
3. 点击「确认修改」
### 安全特性
- 连续3次密码错误将锁定账户10分钟
- 锁定期间显示实时倒计时
- 提供「忘记密码」入口
---
## 项目结构
```
auto-deploy-demo/
├── server/ # 后端代码
│ ├── index.js # 入口文件
│ ├── config/ # 配置模块
│ ├── routes/ # API路由
│ │ ├── auth.js # 认证相关
│ │ ├── projects.js # 项目管理
│ │ └── deploy.js # 部署相关
│ ├── services/ # 业务服务
│ │ ├── projectService.js
│ │ ├── processManager.js
│ │ └── nginxManager.js # Nginx配置管理
│ ├── templates/ # 配置模板
│ │ └── nginx/
│ │ ├── main.conf.tpl
│ │ └── location.conf.tpl
│ ├── middleware/ # 中间件
│ ├── utils/ # 工具函数
│ │ └── loginLimiter.js
│ └── data/ # 数据存储目录
├── client/ # 前端代码
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ ├── components/ # 通用组件
│ │ └── stores/ # 状态管理
│ └── dist/ # 构建产物
├── nginx/ # Nginx配置目录
│ └── sites-enabled/ # 自动生成的配置
├── projects/ # 上传的项目存储
├── deploy/ # 部署脚本
└── .env # 环境配置
```
---
## API 接口
### 认证相关
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/auth/login | 用户登录 |
| GET | /api/auth/verify | 验证Token |
| POST | /api/auth/change-password | 修改密码 |
| GET | /api/auth/lock-status/:username | 获取锁定状态 |
### 项目管理
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /api/projects | 获取项目列表 |
| POST | /api/projects | 创建项目 |
| GET | /api/projects/:id | 获取项目详情 |
| DELETE | /api/projects/:id | 删除项目 |
### 部署相关
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/deploy/:id/start | 启动项目 |
| POST | /api/deploy/:id/stop | 停止项目 |
| GET | /api/deploy/:id/status | 获取运行状态 |
| GET | /api/deploy/:id/logs | 获取运行日志 |
| GET | /api/deploy/nginx/status | 获取Nginx配置状态 |
---
## 支持的项目类型
| 类型 | 说明 |
|------|------|
| 静态HTML | 直接部署,无需构建 |
| Vue/React构建产物 | 上传dist目录内容 |
| Vite项目 | 自动识别并启动 |
---
## 注意事项
1. **文件大小**: 单个文件最大100MB
2. **端口范围**:
- 管理系统: 8888
- 演示项目: 9000-9100内部端口Nginx模式下外部不可见
3. **并发限制**: 最多同时运行100个项目
4. **数据备份**: 请定期备份 `server/data``projects` 目录
5. **Nginx模式**: 需要确保Node.js进程有权限执行nginx命令
---
## 常见问题
### Q: 上传后项目无法访问?
检查项目是否包含 `index.html` 入口文件。
### Q: 启动失败怎么办?
查看项目详情页的操作日志,了解错误原因。
### Q: 刷新页面显示404
系统已支持SPA路由回退如仍有问题请检查项目路由配置。
### Q: 如何修改登录密码?
点击右上角「设置」按钮,在弹窗中修改密码。
### Q: 密码错误多次被锁定?
连续3次密码错误将锁定10分钟请等待倒计时结束后重试。
### Q: Nginx模式下项目无法访问
1. 检查Nginx是否正常运行: `nginx -t`
2. 检查配置文件是否生成: `cat nginx/sites-enabled/auto-deploy.conf`
3. 检查Nginx错误日志: `tail -f /var/log/nginx/error.log`
4. 确认Node.js有权限执行nginx命令
### Q: Windows下Nginx命令执行失败
确保Nginx安装目录已添加到系统PATH环境变量或使用完整路径
```env
NGINX_RELOAD_CMD=C:\nginx\nginx.exe -s reload
NGINX_TEST_CMD=C:\nginx\nginx.exe -t
```
---
## 许可证
MIT License
## 联系方式
如有问题或建议,请联系系统管理员。