diff --git a/deploy_code.sh b/deploy_code.sh index 9efd1b7..5b0300b 100755 --- a/deploy_code.sh +++ b/deploy_code.sh @@ -8,53 +8,81 @@ REMOTE_BACKUP_BASE="$REMOTE_DIR/data_copy" REMOTE_BACKUP_DIR="$REMOTE_BACKUP_BASE/$TIMESTAMP" echo "===================================================" -echo "🚀 开始增量部署 (仅代码,不影响数据库和图片)" +echo "🚀 开始自动化增量部署 (含自我修复与依赖瘦身)" echo "===================================================" -# 1. 远端备份 (使用 sudo 提权) -echo "[1/4] 正在服务器上备份旧代码并清理多余备份 (可能需要输入服务器密码)..." +# 1. 远端备份与环境急救 +echo "[1/4] 正在服务器上急救环境并备份旧代码 (可能需要输入密码)..." ssh -t $SERVER "sudo mkdir -p $REMOTE_BACKUP_DIR && \ cd $REMOTE_DIR && \ + echo '>> 检查并修复缺失目录 (防止 tar 崩溃)...' && \ + sudo mkdir -p inventory-backend inventory-web && \ + 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 {}'" + sudo sh -c 'ls -dt */ 2>/dev/null | tail -n +3 | xargs -I {} rm -rf {} || true'" if [ $? -ne 0 ]; then echo "❌ 服务器备份或清理失败,终止部署!"; exit 1; fi -# 2. 本地打包 (新增了精准拦截本地图片和本地数据库) -echo "[2/4] 正在本地打包新代码 (自动剔除本地图片、数据库和缓存)..." +# 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' \ + --exclude="*/node_modules" \ + --exclude="*/venv" \ + --exclude="*/.venv" \ + --exclude="*/__pycache__" \ + --exclude="*.pyc" \ + --exclude="*/.git" \ + --exclude="*/.idea" \ + --exclude="*/.vscode" \ + --exclude="inventory-backend/uploads" \ + --exclude="inventory-backend/models" \ + --exclude="inventory-backend/pgdata" \ + --exclude="inventory-backend/pgdata_docker" \ + --exclude="data_copy" \ inventory-backend inventory-web docker-compose.prod.yml -# 3. 传输到生产环境的 /tmp 目录 (避开权限拦截) +# 检查压缩包大小是否正常 (如果超过 50MB 则发出警告) +FILESIZE=$(stat -c%s "deploy.tar.gz" 2>/dev/null || stat -f%z "deploy.tar.gz") +MB_SIZE=$((FILESIZE / 1024 / 1024)) +echo ">> 打包完成,当前传输包大小: ${MB_SIZE} MB" +if [ "$MB_SIZE" -gt 50 ]; then + echo "⚠️ 警告:包体积仍大于 50MB,可能存在未排除的大文件,但继续执行..." +fi + +# 3. 传输到生产环境的 /tmp 目录 echo "[3/4] 正在传输代码到服务器的临时目录..." scp deploy.tar.gz $SERVER:/tmp/deploy.tar.gz +if [ $? -ne 0 ]; then + echo "❌ 传输失败!可能是网络中断,终止部署!" + rm -f deploy.tar.gz + exit 1 +fi -# 4. 服务器执行替换与重启 (修复了 docker-compose 找不到命令的问题) -echo "[4/4] 正在生产环境执行热更新 (可能需要输入服务器密码)..." +# 4. 服务器执行替换与重启 +echo "[4/4] 正在生产环境执行热更新 (可能需要输入密码)..." ssh -t $SERVER "cd $REMOTE_DIR && \ + echo '>> 移除历史旧目录...' && \ sudo rm -rf inventory-backend_old inventory-web_old && \ + echo '>> 备份当前目录为 old...' && \ (sudo mv inventory-backend inventory-backend_old 2>/dev/null || true) && \ (sudo mv inventory-web inventory-web_old 2>/dev/null || true) && \ + echo '>> 部署新代码...' && \ sudo mv /tmp/deploy.tar.gz . && \ sudo tar -xzf deploy.tar.gz && \ + echo '>> 重启 Docker 容器...' && \ 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 +if [ $? -ne 0 ]; then + echo "❌ 远端启动失败,请检查 Docker 日志!" +else + echo "===================================================" + echo "✅ 部署完美完成!请刷新网页查看效果。" + echo "===================================================" +fi + +# 扫尾清理本地文件 +rm -f deploy.tar.gz \ No newline at end of file diff --git a/inventory-backend/app/services/print/simhei.ttf b/inventory-backend/app/services/print/simhei.ttf new file mode 100644 index 0000000..3326815 Binary files /dev/null and b/inventory-backend/app/services/print/simhei.ttf differ