diff --git a/deploy_code.sh b/deploy_code.sh new file mode 100755 index 0000000..9efd1b7 --- /dev/null +++ b/deploy_code.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# === 配置项 === +SERVER="dxc@172.16.0.198" +REMOTE_DIR="/opt/inventory-app" +TIMESTAMP=$(date +%Y%m%d_%H%M) +REMOTE_BACKUP_BASE="$REMOTE_DIR/data_copy" +REMOTE_BACKUP_DIR="$REMOTE_BACKUP_BASE/$TIMESTAMP" + +echo "===================================================" +echo "🚀 开始增量部署 (仅代码,不影响数据库和图片)" +echo "===================================================" + +# 1. 远端备份 (使用 sudo 提权) +echo "[1/4] 正在服务器上备份旧代码并清理多余备份 (可能需要输入服务器密码)..." +ssh -t $SERVER "sudo mkdir -p $REMOTE_BACKUP_DIR && \ + cd $REMOTE_DIR && \ + sudo tar -czf $REMOTE_BACKUP_DIR/code_backup.tar.gz inventory-backend inventory-web docker-compose.prod.yml && \ + echo '>> 执行清理:仅保留 data_copy 下最新的 2 个备份...' && \ + cd $REMOTE_BACKUP_BASE && \ + sudo sh -c 'ls -dt */ | tail -n +3 | xargs -I {} rm -rf {}'" + +if [ $? -ne 0 ]; then echo "❌ 服务器备份或清理失败,终止部署!"; exit 1; fi + +# 2. 本地打包 (新增了精准拦截本地图片和本地数据库) +echo "[2/4] 正在本地打包新代码 (自动剔除本地图片、数据库和缓存)..." +tar -czf deploy.tar.gz \ + --exclude='node_modules' \ + --exclude='.venv' \ + --exclude='venv' \ + --exclude='__pycache__' \ + --exclude='*.pyc' \ + --exclude='.git' \ + --exclude='.idea' \ + --exclude='.vscode' \ + --exclude='pgdata_*' \ + --exclude='uploads_*' \ + --exclude='data_copy' \ + --exclude='inventory-backend/uploads' \ + --exclude='inventory-backend/pgdata' \ + inventory-backend inventory-web docker-compose.prod.yml + +# 3. 传输到生产环境的 /tmp 目录 (避开权限拦截) +echo "[3/4] 正在传输代码到服务器的临时目录..." +scp deploy.tar.gz $SERVER:/tmp/deploy.tar.gz + +# 4. 服务器执行替换与重启 (修复了 docker-compose 找不到命令的问题) +echo "[4/4] 正在生产环境执行热更新 (可能需要输入服务器密码)..." +ssh -t $SERVER "cd $REMOTE_DIR && \ + sudo rm -rf inventory-backend_old inventory-web_old && \ + (sudo mv inventory-backend inventory-backend_old 2>/dev/null || true) && \ + (sudo mv inventory-web inventory-web_old 2>/dev/null || true) && \ + sudo mv /tmp/deploy.tar.gz . && \ + sudo tar -xzf deploy.tar.gz && \ + sudo docker compose -f docker-compose.prod.yml up -d --build backend frontend && \ + sudo rm deploy.tar.gz" + +echo "===================================================" +echo "✅ 部署完成!请刷新网页查看效果。" +echo "===================================================" \ No newline at end of file diff --git a/deploy_full.sh b/deploy_full.sh new file mode 100755 index 0000000..9e3a5e2 --- /dev/null +++ b/deploy_full.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +# === 配置项 === +SERVER="dxc@172.16.0.198" +REMOTE_DIR="/opt/inventory-app" +TIMESTAMP=$(date +%Y%m%d_%H%M) +REMOTE_BACKUP_BASE="$REMOTE_DIR/data_copy" +REMOTE_BACKUP_DIR="$REMOTE_BACKUP_BASE/$TIMESTAMP" + +echo "⚠️⚠️⚠️ 警告:这将使用本地数据库覆盖生产数据库! ⚠️⚠️⚠️" +read -p "确认要继续吗?(y/n) " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 +fi + +# 1. 远端全量备份 (使用 sudo 提权) +echo "[1/5] 正在执行生产环境完整备份 (可能需要输入服务器密码)..." +ssh -t $SERVER "sudo mkdir -p $REMOTE_BACKUP_DIR && \ + cd $REMOTE_DIR && \ + echo '>> 正在导出线上数据库...' && \ + sudo sh -c 'docker exec inventory_db_prod pg_dumpall -c -U prod_user | gzip > $REMOTE_BACKUP_DIR/db_backup.sql.gz' && \ + echo '>> 正在打包线上代码...' && \ + sudo tar -czf $REMOTE_BACKUP_DIR/code_backup.tar.gz inventory-backend inventory-web docker-compose.prod.yml && \ + echo '>> 执行清理:仅保留 data_copy 下最新的 2 个备份...' && \ + cd $REMOTE_BACKUP_BASE && \ + sudo sh -c 'ls -dt */ | tail -n +3 | xargs -I {} rm -rf {}'" + +if [ $? -ne 0 ]; then echo "❌ 远端备份失败,为保护数据已终止部署!"; exit 1; fi + +# 2. 导出本地数据库 +echo "[2/5] 正在导出本地数据库..." +docker exec inventory_db pg_dumpall -c -U test | gzip > db_sync.sql.gz + +# 3. 本地打包 (新增了精准拦截本地图片、数据库文件和各类缓存) +echo "[3/5] 正在本地打包代码和数据库..." +tar -czf deploy_full.tar.gz \ + --exclude='node_modules' \ + --exclude='.venv' \ + --exclude='venv' \ + --exclude='__pycache__' \ + --exclude='*.pyc' \ + --exclude='.git' \ + --exclude='.idea' \ + --exclude='.vscode' \ + --exclude='pgdata_*' \ + --exclude='uploads_*' \ + --exclude='data_copy' \ + --exclude='inventory-backend/uploads' \ + --exclude='inventory-backend/pgdata' \ + inventory-backend inventory-web docker-compose.prod.yml db_sync.sql.gz + +# 4. 传输到生产环境的 /tmp 目录 +echo "[4/5] 正在传输到服务器临时目录..." +scp deploy_full.tar.gz $SERVER:/tmp/deploy_full.tar.gz + +# 5. 服务器执行替换 (修复了 docker compose 找不到命令的问题) +echo "[5/5] 正在远端部署代码并导入数据库 (可能需要输入服务器密码)..." +ssh -t $SERVER "cd $REMOTE_DIR && \ + sudo rm -rf inventory-backend_old inventory-web_old && \ + (sudo mv inventory-backend inventory-backend_old 2>/dev/null || true) && \ + (sudo mv inventory-web inventory-web_old 2>/dev/null || true) && \ + sudo mv /tmp/deploy_full.tar.gz . && \ + sudo tar -xzf deploy_full.tar.gz && \ + sudo docker compose -f docker-compose.prod.yml up -d --build && \ + echo '>> 正在导入数据库...' && \ + sudo sh -c 'gunzip -c db_sync.sql.gz | docker exec -i inventory_db_prod psql -U prod_user -d inventory_system' && \ + sudo rm deploy_full.tar.gz db_sync.sql.gz" + +echo "✅ 全量部署完成!" \ No newline at end of file