From a1cd6540c68b0cd16bfcc3df3c270b225a939e3f Mon Sep 17 00:00:00 2001 From: qinjian Date: Wed, 10 Sep 2025 16:09:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E3=80=81=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=92=8C=E5=BA=94=E7=94=A8=E6=89=93=E5=8C=85=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/check-environment.sh | 42 ++++++++++++++ script/deploy-on-server.sh | 23 ++++++++ script/package-app.sh | 109 ++++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 script/check-environment.sh create mode 100644 script/deploy-on-server.sh create mode 100644 script/package-app.sh diff --git a/script/check-environment.sh b/script/check-environment.sh new file mode 100644 index 0000000..8036f4f --- /dev/null +++ b/script/check-environment.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# 环境检查脚本 + +echo "检查部署环境..." + +# 检查 Node.js +if command -v node &> /dev/null; then + NODE_VERSION=$(node -v) + echo "✓ Node.js 已安装: $NODE_VERSION" + + # 检查版本是否 >= 20 + NODE_MAJOR_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) + if [ "$NODE_MAJOR_VERSION" -ge 20 ]; then + echo "✓ Node.js 版本符合要求 (v20+)" + else + echo "✗ Node.js 版本过低,需要 v20+" + exit 1 + fi +else + echo "✗ Node.js 未安装" + echo "请先安装 Node.js 20+:" + echo "curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -" + echo "sudo apt-get install -y nodejs" + exit 1 +fi + +# 检查 npm +if command -v npm &> /dev/null; then + echo "✓ npm 已安装: $(npm -v)" +else + echo "✗ npm 未安装" + exit 1 +fi + +# 检查 systemd +if systemctl --version &> /dev/null; then + echo "✓ systemd 可用" +else + echo "✗ systemd 不可用,将无法设置开机自启" +fi + +echo "环境检查完成!" diff --git a/script/deploy-on-server.sh b/script/deploy-on-server.sh new file mode 100644 index 0000000..2ff6459 --- /dev/null +++ b/script/deploy-on-server.sh @@ -0,0 +1,23 @@ +#!/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 new file mode 100644 index 0000000..56af6f4 --- /dev/null +++ b/script/package-app.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# 应用打包脚本 - 在开发环境运行 + +APP_NAME="my-node-app" +VERSION="1.0.0" +TARGET_DIR="./build" +DEPLOY_PACKAGE="${APP_NAME}-${VERSION}.tar.gz" + +echo "打包 Node.js 应用..." + +# 清理旧构建 +rm -rf $TARGET_DIR +mkdir -p $TARGET_DIR + +# 复制源代码 +cp -r ./* $TARGET_DIR/ + +# 创建部署脚本 +cat > $TARGET_DIR/deploy.sh << 'EOF' +#!/bin/bash +# 应用部署脚本 + +APP_NAME="my-node-app" +INSTALL_DIR="/opt/$APP_NAME" +SERVICE_NAME="$APP_NAME.service" + +echo "正在部署 $APP_NAME..." + +# 检查 Node.js 是否安装 +if ! command -v node &> /dev/null; then + echo "错误: Node.js 未安装。请先安装 Node.js 20+" + exit 1 +fi + +# 停止现有服务 +if systemctl is-active --quiet $SERVICE_NAME; then + systemctl stop $SERVICE_NAME +fi + +# 禁用现有服务 +if systemctl is-enabled --quiet $SERVICE_NAME; then + systemctl disable $SERVICE_NAME +fi + +# 创建安装目录 +mkdir -p $INSTALL_DIR + +# 复制文件 +cp -r ./* $INSTALL_DIR/ + +# 安装依赖 +cd $INSTALL_DIR +npm install + +# 创建 systemd 服务文件 +cat > /etc/systemd/system/$SERVICE_NAME << SERVICE_EOF +[Unit] +Description=$APP_NAME Node.js Application +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=$INSTALL_DIR +ExecStart=/usr/bin/npm start +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +SERVICE_EOF + +# 重新加载 systemd +systemctl daemon-reload + +# 启用并启动服务 +systemctl enable $SERVICE_NAME +systemctl start $SERVICE_NAME + +echo "部署完成! 服务状态:" +systemctl status $SERVICE_NAME --no-pager +EOF + +chmod +x $TARGET_DIR/deploy.sh + +# 创建安装说明 +cat > $TARGET_DIR/README.md << 'EOF' +# 应用安装说明 + +## 要求 +- Linux 系统 +- Node.js 20+ 已安装 + +## 安装步骤 +1. 上传此文件夹到目标服务器 +2. 运行: ./deploy.sh + +## 管理服务 +- 启动: 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 +EOF + +# 创建打包文件 +tar -czf $DEPLOY_PACKAGE -C $TARGET_DIR . + +echo "打包完成: $DEPLOY_PACKAGE" +echo "请将此文件上传到服务器并解压后运行 ./deploy.sh"