diff --git a/README.md b/README.md index 5345b22..8c1f65c 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,31 @@ -# jsite 自动化部署和管理脚本 +# jsite.sh - 前端自动化部署脚本 -这是一个集成了完整部署和日常管理功能的自动化脚本,支持多种任务模式。 +## 概述 -## 功能特性 +`jsite.sh` 是一个用于自动化部署和管理前端网站的bash脚本。它支持多种操作模式,包括部署、启动、停止、重启等。 -- 🚀 **完整部署**:一键部署完整的jsite环境 -- 🏗️ **网站管理**:创建、删除、构建、启动、停止、重启网站 -- 📊 **状态监控**:查看网站运行状态和日志 -- 🔧 **环境管理**:Docker、Node.js、PM2、Traefik等环境组件 -- ⚡ **智能端口分配**:自动分配和管理端口资源 +## 主要功能 + +- 自动创建和管理jingrow用户 +- 安装和配置Node.js、npm、PM2 +- 自动化部署前端项目 +- 集成Traefik反向代理 +- 支持多种操作模式 ## 使用方法 ### 基本语法 ```bash -./install_jsite.sh --mode <任务模式> [其他参数] +./jsite.sh --mode <模式> --site-name <网站名称> ``` -### 支持的任务模式 +### 支持的模式 -| 模式 | 功能 | 示例 | +| 模式 | 描述 | 示例 | |------|------|------| -| `deploy` | 完整部署模式(默认) | `--mode deploy --site-name myproject` | -| `create` | 创建新网站 | `--mode create --site-name myproject --git-repo <仓库地址>` | +| `deploy` | 完整部署网站 | `--mode deploy --site-name myproject` | +| `create` | 创建新网站 | `--mode create --site-name myproject` | | `delete` | 删除网站 | `--mode delete --site-name myproject` | | `build` | 构建网站 | `--mode build --site-name myproject` | | `start` | 启动网站 | `--mode start --site-name myproject` | @@ -33,157 +35,152 @@ | `list` | 列出所有网站 | `--mode list` | | `logs` | 查看网站日志 | `--mode logs --site-name myproject` | -### 常用参数 - -| 参数 | 说明 | 默认值 | -|------|------|--------| -| `--mode` | 任务模式 | `deploy` | -| `--site-name` | 网站名称 | `jingrow` | -| `--git-repo` | Git仓库地址 | `http://git.jingrow.com:3000/jsite/jingrow` | -| `--node-version` | Node.js版本 | `22` | -| `--start-port` | 起始端口 | `3001` | -| `--site-url` | 网站域名 | `starrbud.com` | - -### 使用示例 - -#### 1. 完整部署新项目 +### 常用命令示例 ```bash -./install_jsite.sh \ - --mode deploy \ - --site-name myproject \ - --git-repo http://git.example.com/myproject \ - --site-url myproject.com \ - --public-ip 8.217.167.199 -``` +# 部署新网站 +./jsite.sh --mode deploy --site-name jingrow -#### 2. 创建新网站 - -```bash -./install_jsite.sh \ - --mode create \ - --site-name myproject \ - --git-repo http://git.example.com/myproject \ - --site-url myproject.com -``` - -#### 3. 构建和启动网站 - -```bash -# 构建项目 -./install_jsite.sh --mode build --site-name myproject - -# 启动项目 -./install_jsite.sh --mode start --site-name myproject -``` - -#### 4. 管理网站状态 - -```bash -# 查看状态 -./install_jsite.sh --mode status --site-name myproject - -# 停止网站 -./install_jsite.sh --mode stop --site-name myproject +# 启动网站 +./jsite.sh --mode start --site-name jingrow # 重启网站 -./install_jsite.sh --mode restart --site-name myproject +./jsite.sh --mode restart --site-name jingrow + +# 查看网站状态 +./jsite.sh --mode status --site-name jingrow + +# 查看所有网站 +./jsite.sh --mode list ``` -#### 5. 查看所有网站 +## 故障排除 +### 常见错误及解决方案 + +#### 1. PM2进程未找到错误 + +**错误信息:** +``` +[PM2][ERROR] Process or Namespace jingrow not found +``` + +**原因:** 网站尚未部署或PM2进程未正确启动 + +**解决方案:** +1. 首先检查网站是否存在: + ```bash + ./jsite.sh --mode status --site-name jingrow + ``` + +2. 如果网站不存在,先部署: + ```bash + ./jsite.sh --mode deploy --site-name jingrow + ``` + +3. 如果网站存在但未运行,启动网站: + ```bash + ./jsite.sh --mode start --site-name jingrow + ``` + +#### 2. 权限错误 + +**解决方案:** ```bash -./install_jsite.sh --mode list +# 确保脚本有执行权限 +chmod +x jsite.sh + +# 以root用户运行 +sudo ./jsite.sh --mode start --site-name jingrow ``` -#### 6. 查看日志 +#### 3. 端口冲突 +**解决方案:** ```bash -./install_jsite.sh --mode logs --site-name myproject +# 检查端口占用 +netstat -tlnp | grep :3001 + +# 停止占用端口的进程 +sudo kill -9 <进程ID> ``` -## 工作流程 +### 手动检查和修复 -### 完整部署流程 (deploy) -1. 创建jingrow用户 -2. 安装Docker(可选跳过) -3. 安装Node.js和NVM -4. 克隆项目代码 -5. 创建环境配置文件 -6. 安装项目依赖 -7. 安装PM2并启动项目 -8. 安装Traefik并配置反向代理 +#### 检查PM2状态 +```bash +# 切换到jingrow用户 +su - jingrow -### 网站管理流程 -- **create**: 克隆代码 → 分配端口 → 创建配置 → 提示下一步 -- **build**: 安装依赖 → 构建项目 -- **start**: 检查状态 → 分配端口 → 启动PM2进程 -- **stop**: 停止PM2进程 -- **restart**: 重启PM2进程或启动(如果未运行) -- **delete**: 停止进程 → 清理配置 → 删除文件 +# 加载nvm环境 +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" -## 目录结构 +# 查看PM2进程列表 +pm2 list + +# 查看PM2日志 +pm2 logs +``` + +#### 手动启动PM2进程 +```bash +# 切换到jingrow用户 +su - jingrow + +# 加载nvm环境 +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" + +# 启动进程 +pm2 start jingrow + +# 或者重新加载配置 +pm2 reload jingrow +``` + +## 配置说明 + +### 环境变量 + +脚本支持以下环境变量配置: + +- `SITE_NAME`: 网站名称(默认:jingrow) +- `GIT_REPO`: Git仓库地址 +- `NODE_VERSION`: Node.js版本(默认:22) +- `START_PORT`: 起始端口(默认:3001) +- `SITE_URL`: 网站域名 +- `BACKEND_SERVER_URL`: 后端服务器地址 + +### 目录结构 ``` /home/jingrow/ ├── jsite/ # 网站项目目录 -│ ├── myproject1/ # 项目1 -│ ├── myproject2/ # 项目2 -│ └── site_port.json # 端口分配记录 -├── traefik-docker/ # Traefik配置目录 -│ └── conf.d/website/ # 网站配置文件 -└── .nvm/ # Node.js版本管理 +├── .nvm/ # Node版本管理器 +├── traefik-docker/ # Traefik配置 +└── ... ``` ## 注意事项 -1. **权限要求**:脚本需要root权限运行 -2. **端口管理**:自动分配端口,避免冲突 -3. **环境依赖**:确保系统支持Docker和Node.js -4. **域名配置**:需要正确配置DNS解析 -5. **SSL证书**:Traefik自动申请Let's Encrypt证书 - -## 故障排除 - -### 常见问题 - -1. **端口被占用** - - 检查端口分配文件:`/home/jingrow/jsite/site_port.json` - - 手动修改端口或停止占用进程 - -2. **PM2启动失败** - - 检查项目依赖是否正确安装 - - 查看PM2日志:`pm2 logs <项目名>` - - 确认package.json中有start脚本 - -3. **Traefik配置问题** - - 检查配置文件:`/home/jingrow/traefik-docker/conf.d/website/` - - 重启Traefik服务 - -4. **域名访问问题** - - 确认DNS解析正确 - - 检查防火墙设置 - - 验证SSL证书状态 - -### 日志查看 - -```bash -# PM2日志 -pm2 logs <项目名> - -# Traefik日志 -docker logs - -# 系统日志 -journalctl -u docker -``` +1. 脚本需要以root权限运行 +2. 确保服务器有足够的磁盘空间和内存 +3. 确保网络连接正常,能够访问Git仓库 +4. 建议在生产环境使用前先在测试环境验证 ## 更新日志 -- **v2.0**: 整合jsite.sh功能,支持多种任务模式 -- **v1.0**: 基础部署功能 +### v1.1.0 +- 修复了start_site和restart_site函数的无限递归问题 +- 改进了错误处理和日志输出 +- 优化了PM2进程管理逻辑 -## 许可证 +## 技术支持 -MIT License +如果遇到问题,请检查: +1. 脚本执行日志 +2. PM2进程状态 +3. 系统资源使用情况 +4. 网络连接状态 diff --git a/jsite.sh b/jsite.sh index 5227e30..8cb1268 100644 --- a/jsite.sh +++ b/jsite.sh @@ -1479,6 +1479,9 @@ create_site() { # 创建.env文件 create_env_file + # 创建PM2配置文件 + create_pm2_config + # 创建traefik配置文件 if create_traefik_website_config "$SITE_NAME" "$SITE_URL" "$port"; then restart_traefik diff --git a/test_status.sh b/test_status.sh new file mode 100644 index 0000000..da0d264 --- /dev/null +++ b/test_status.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# 测试修复后的状态检测功能 +echo "=== 测试修复后的状态检测功能 ===" + +# 测试get_site_status函数 +test_get_site_status() { + echo "测试 get_site_status 函数..." + + # 模拟PM2 list输出 + echo "模拟PM2 list输出:" + echo "┌─────┬────────────────┬──────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐" + echo "│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │" + echo "├─────┼────────────────┼──────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤" + echo "│ 0 │ jingrow │ default │ 1.0.0 │ fork │ 12345 │ 2D │ 0 │ online │ 0% │ 45.0mb │ jingrow │ disabled │" + echo "│ 1 │ testapp │ default │ 1.0.0 │ fork │ 12346 │ 0s │ 0 │ stopped │ 0% │ 0b │ jingrow │ disabled │" + echo "│ 2 │ erroredapp │ default │ 1.0.0 │ fork │ 0 │ 0s │ 5 │ errored │ 0% │ 0b │ jingrow │ disabled │" + echo "└─────┴────────────────┴──────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘" + + echo "" + echo "状态解析说明:" + echo "- jingrow: 状态为 'online' -> 应该返回 'running'" + echo "- testapp: 状态为 'stopped' -> 应该返回 'stopped'" + echo "- erroredapp: 状态为 'errored' -> 应该返回 'error'" +} + +# 测试端口检测 +test_port_detection() { + echo "" + echo "=== 测试端口检测功能 ===" + + # 检查常用端口 + local ports=(3001 3002 8080 80 443) + + for port in "${ports[@]}"; do + echo "检查端口 $port:" + if netstat -tlnp 2>/dev/null | grep -q ":$port "; then + echo " ✓ 端口 $port 正在监听 (netstat)" + elif ss -tlnp 2>/dev/null | grep -q ":$port "; then + echo " ✓ 端口 $port 正在监听 (ss)" + else + echo " ✗ 端口 $port 未被监听" + fi + done +} + +# 测试PM2命令可用性 +test_pm2_availability() { + echo "" + echo "=== 测试PM2命令可用性 ===" + + # 检查jingrow用户的PM2 + echo "检查jingrow用户的PM2:" + if su - jingrow -c "command -v pm2" 2>/dev/null; then + echo " ✓ PM2命令可用" + + # 检查PM2版本 + local pm2_version=$(su - jingrow -c "pm2 -v" 2>/dev/null) + if [ -n "$pm2_version" ]; then + echo " ✓ PM2版本: $pm2_version" + else + echo " ✗ 无法获取PM2版本" + fi + + # 检查PM2进程列表 + echo " PM2进程列表:" + su - jingrow -c "pm2 list" 2>/dev/null || echo " ✗ 无法获取PM2进程列表" + else + echo " ✗ PM2命令不可用" + fi +} + +# 运行测试 +test_get_site_status +test_port_detection +test_pm2_availability + +echo "" +echo "=== 测试完成 ===" +echo "现在可以运行修复后的脚本:" +echo " /tmp/jsite.sh --mode status --site-name jingrow" \ No newline at end of file