diff --git a/script/deploy-on-server.sh b/script/deploy-on-server.sh deleted file mode 100644 index 2ff6459..0000000 --- a/script/deploy-on-server.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# 服务器端部署脚本 - 在服务器上运行 - -APP_NAME="my-node-app" -PACKAGE_PATH="./$APP_NAME-1.0.0.tar.gz" -INSTALL_DIR="/tmp/$APP_NAME-install" - -if [ ! -f "$PACKAGE_PATH" ]; then - echo "错误: 找不到部署包 $PACKAGE_PATH" - exit 1 -fi - -# 创建临时安装目录 -mkdir -p $INSTALL_DIR -tar -xzf $PACKAGE_PATH -C $INSTALL_DIR - -# 运行部署脚本 -cd $INSTALL_DIR -chmod +x deploy.sh -./deploy.sh - -# 清理 -rm -rf $INSTALL_DIR diff --git a/script/package-app.sh b/script/package-app.sh index 56af6f4..21b10ab 100644 --- a/script/package-app.sh +++ b/script/package-app.sh @@ -1,7 +1,7 @@ #!/bin/bash # 应用打包脚本 - 在开发环境运行 -APP_NAME="my-node-app" +APP_NAME="wuyuanbiaoba-web" VERSION="1.0.0" TARGET_DIR="./build" DEPLOY_PACKAGE="${APP_NAME}-${VERSION}.tar.gz" @@ -13,45 +13,132 @@ rm -rf $TARGET_DIR mkdir -p $TARGET_DIR # 复制源代码 -cp -r ./* $TARGET_DIR/ - +# 复制文件 +cp package.json $TARGET_DIR/ +cp package-lock.json $TARGET_DIR/ +cp index.html $TARGET_DIR/ +cp config.cjs $TARGET_DIR/ +[ -f README.md ] && cp README.md $TARGET_DIR/ + +# 复制目录 +cp -r client/ $TARGET_DIR/ +cp -r server/ $TARGET_DIR/ +cp -r script/ $TARGET_DIR/ # 创建部署脚本 cat > $TARGET_DIR/deploy.sh << 'EOF' #!/bin/bash # 应用部署脚本 -APP_NAME="my-node-app" +APP_NAME="wuyuanbiaoba-web" INSTALL_DIR="/opt/$APP_NAME" SERVICE_NAME="$APP_NAME.service" echo "正在部署 $APP_NAME..." +# 检查是否为 root 权限 +if [ "$EUID" -ne 0 ]; then + echo "错误: 请使用 root 权限运行此脚本 (sudo ./deploy.sh)" + exit 1 +fi + +# 检查 systemd 是否可用 +if ! pidof systemd &>/dev/null; then + echo "错误: 当前系统不支持 systemd" + exit 1 +fi + # 检查 Node.js 是否安装 if ! command -v node &> /dev/null; then echo "错误: Node.js 未安装。请先安装 Node.js 20+" exit 1 fi +# 检查 Node.js 版本 +NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) +if [ "$NODE_VERSION" -lt 20 ]; then + echo "错误: Node.js 版本过低 (当前: $(node -v)),需要 20+" + exit 1 +fi + +# 检查 npm 是否可用 +if ! command -v npm &> /dev/null; then + echo "错误: npm 未安装或不可用" + exit 1 +fi + # 停止现有服务 if systemctl is-active --quiet $SERVICE_NAME; then + echo "停止现有服务..." systemctl stop $SERVICE_NAME + sleep 2 fi # 禁用现有服务 if systemctl is-enabled --quiet $SERVICE_NAME; then + echo "禁用现有服务..." systemctl disable $SERVICE_NAME fi +# 备份现有安装(如果存在) +if [ -d "$INSTALL_DIR" ]; then + BACKUP_DIR="${INSTALL_DIR}_backup_$(date +%Y%m%d_%H%M%S)" + echo "备份现有安装到: $BACKUP_DIR" + mv "$INSTALL_DIR" "$BACKUP_DIR" + + # 删除超过7天的旧备份 + find $(dirname "$INSTALL_DIR") -name "$(basename $INSTALL_DIR)_backup_*" -mtime +7 -exec rm -rf {} \; 2>/dev/null || true + echo "已清理超过7天的旧备份" +fi + # 创建安装目录 mkdir -p $INSTALL_DIR # 复制文件 +echo "复制应用文件..." cp -r ./* $INSTALL_DIR/ +# 复制隐藏文件(如果存在) +shopt -s dotglob +for file in .*; do + if [[ "$file" != "." && "$file" != ".." ]]; then + cp -r "$file" "$INSTALL_DIR/" 2>/dev/null || true + fi +done +shopt -u dotglob + # 安装依赖 +echo "安装依赖包..." cd $INSTALL_DIR npm install +# 检查主入口文件 +if [ ! -f "package.json" ]; then + echo "错误: package.json 文件不存在" + exit 1 +fi + +# 获取 npm 和 node 的完整路径 +NPM_PATH=$(which npm) +NODE_PATH=$(which node) + +echo "使用 Node.js: $NODE_PATH" +echo "使用 npm: $NPM_PATH" + +# 检查是否使用 nvm 并设置环境变量 +if [[ "$NODE_PATH" == *"/.nvm/"* ]]; then + echo "检测到使用 nvm 管理 Node.js" + NVM_NODE_DIR=$(dirname "$NODE_PATH") + echo "Node.js 目录: $NVM_NODE_DIR" + # 为 systemd 设置完整的 PATH + SYSTEMD_PATH="$NVM_NODE_DIR:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + # 使用 node 直接执行 npm,避免 env 查找问题 + EXEC_START="$NODE_PATH $NPM_PATH start" +else + echo "使用系统安装的 Node.js" + SYSTEMD_PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + EXEC_START="$NPM_PATH start" +fi + # 创建 systemd 服务文件 cat > /etc/systemd/system/$SERVICE_NAME << SERVICE_EOF [Unit] @@ -62,9 +149,11 @@ After=network.target Type=simple User=root WorkingDirectory=$INSTALL_DIR -ExecStart=/usr/bin/npm start +ExecStart=$EXEC_START Restart=on-failure RestartSec=10 +Environment=NODE_ENV=development +Environment=PATH=$SYSTEMD_PATH [Install] WantedBy=multi-user.target @@ -79,6 +168,21 @@ systemctl start $SERVICE_NAME echo "部署完成! 服务状态:" systemctl status $SERVICE_NAME --no-pager + +# 清理部署文件 +DEPLOY_DIR=$(pwd) +echo "清理部署临时文件..." +cd /tmp +rm -rf "$DEPLOY_DIR" +echo "已清理部署目录: $DEPLOY_DIR" + +echo "" +echo "部署成功完成!" +echo "服务管理命令:" +echo " 启动: systemctl start $SERVICE_NAME" +echo " 停止: systemctl stop $SERVICE_NAME" +echo " 状态: systemctl status $SERVICE_NAME" +echo " 日志: journalctl -u $SERVICE_NAME -f" EOF chmod +x $TARGET_DIR/deploy.sh @@ -91,15 +195,36 @@ cat > $TARGET_DIR/README.md << 'EOF' - Linux 系统 - Node.js 20+ 已安装 -## 安装步骤 -1. 上传此文件夹到目标服务器 -2. 运行: ./deploy.sh +## 推荐部署流程 +1. 上传压缩包到服务器临时目录 (如 /tmp) +2. 解压: `tar -xzf wuyuanbiaoba-web-1.0.0.tar.gz` +3. 进入目录: `cd wuyuanbiaoba-web-1.0.0/` +4. 运行部署: `sudo ./deploy.sh` +5. 部署脚本会自动清理临时文件 + +## 自动清理功能 +- 自动清理超过1天的备份目录 +- 部署完成后自动清理解压的临时目录 +- 只保留 /opt/wuyuanbiaoba-web 运行目录 ## 管理服务 -- 启动: sudo systemctl start my-node-app.service -- 停止: sudo systemctl stop my-node-app.service -- 状态检查: sudo systemctl status my-node-app.service -- 查看日志: journalctl -u my-node-app.service -f +- 启动: sudo systemctl start wuyuanbiaoba-web.service +- 停止: sudo systemctl stop wuyuanbiaoba-web.service +- 状态检查: sudo systemctl status wuyuanbiaoba-web.service +- 查看日志: journalctl -u wuyuanbiaoba-web.service -f + +## 手动清理 (如需要) +```bash +# 清理所有备份 +sudo rm -rf /opt/wuyuanbiaoba-web_backup_* + +# 完全卸载 +sudo systemctl stop wuyuanbiaoba-web.service +sudo systemctl disable wuyuanbiaoba-web.service +sudo rm /etc/systemd/system/wuyuanbiaoba-web.service +sudo systemctl daemon-reload +sudo rm -rf /opt/wuyuanbiaoba-web* +``` EOF # 创建打包文件