|
|
@ -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 |
|
|
|
|
|
|
|
# 创建打包文件 |
|
|
|