deploy(deploy_code.sh): 脚本全量去 sudo 化,实现全程免密部署

/opt/inventory-app 属主为 dxc、docker 在 docker 组免 sudo,
脚本里所有 sudo 均为多余提权,且是手动/自动化部署卡住的主因:
- 第 1、4 步是独立 ssh 会话,每步都要重新输入 sudo 密码
- 非交互/自动化方式运行直接失败
- 去掉所有 sudo 与 ssh -t,无需 tty,手动与自动化通吃
- ssl 证书目录属主 root 不可读,备份那步保留 || 容错跳过
This commit is contained in:
yueli
2026-08-31 16:45:39 +08:00
parent 3717151a7b
commit ee64309151

View File

@ -12,21 +12,21 @@ echo "🚀 开始自动化增量部署 (含自我修复与依赖瘦身)"
echo "==================================================="
# 1. 远端备份与环境急救
echo "[1/4] 正在服务器上急救环境并备份旧代码 (可能需要输入密码)..."
ssh -t $SERVER "sudo mkdir -p $REMOTE_BACKUP_DIR && \
echo "[1/4] 正在服务器上备份旧代码 (全程免密)..."
ssh $SERVER "mkdir -p $REMOTE_BACKUP_DIR && \
cd $REMOTE_DIR && \
echo '>> 检查并修复缺失目录 (防止 tar 崩溃)...' && \
sudo mkdir -p inventory-backend inventory-web models_prod && \
mkdir -p inventory-backend inventory-web models_prod && \
echo '>> 执行代码备份...' && \
# ★ 排除大目录/模型(与本地打包一致)inventory-backend/models 含 605MB onnx不排除会导致 gzip 卡死
sudo tar -czf $REMOTE_BACKUP_DIR/code_backup.tar.gz \
tar -czf $REMOTE_BACKUP_DIR/code_backup.tar.gz \
--exclude='inventory-backend/models' \
--exclude='inventory-backend/uploads' \
--exclude='inventory-backend/pgdata' \
--exclude='inventory-backend/pgdata_docker' \
inventory-backend inventory-web docker-compose.prod.yml && \
echo '>> 备份 SSL 证书...' && \
(sudo tar -czf $REMOTE_BACKUP_DIR/ssl_backup.tar.gz ssl 2>/dev/null || echo '⚠️ ssl 目录不存在,跳过') && \
(tar -czf $REMOTE_BACKUP_DIR/ssl_backup.tar.gz ssl 2>/dev/null || echo '⚠️ ssl 目录不可读(属主 root)或不存在,跳过该备份') && \
echo '>> 检查 CLIP 模型文件...' && \
if [ ! -f models_prod/clip_vision.onnx ]; then \
echo '⚠️ 警告: models_prod/clip_vision.onnx 不存在!拍照识图功能将无法使用。'; \
@ -36,7 +36,7 @@ ssh -t $SERVER "sudo mkdir -p $REMOTE_BACKUP_DIR && \
fi && \
echo '>> 执行清理:仅保留 data_copy 下最新的 2 个备份...' && \
cd $REMOTE_BACKUP_BASE && \
sudo sh -c 'ls -dt */ 2>/dev/null | tail -n +3 | xargs -I {} rm -rf {} || true'"
sh -c 'ls -dt */ 2>/dev/null | tail -n +3 | xargs -I {} rm -rf {} || true'"
if [ $? -ne 0 ]; then echo "❌ 服务器备份或清理失败,终止部署!"; exit 1; fi
@ -84,21 +84,21 @@ if [ $? -ne 0 ]; then
fi
# 4. 服务器执行替换与重启
echo "[4/4] 正在生产环境执行热更新 (可能需要输入密码)..."
ssh -t $SERVER "cd $REMOTE_DIR && \
echo "[4/4] 正在生产环境执行热更新 (全程免密)..."
ssh $SERVER "cd $REMOTE_DIR && \
echo '>> 移除历史旧目录...' && \
sudo rm -rf inventory-backend_old inventory-web_old && \
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) && \
(mv inventory-backend inventory-backend_old 2>/dev/null || true) && \
(mv inventory-web inventory-web_old 2>/dev/null || true) && \
echo '>> 部署新代码...' && \
sudo mv /tmp/deploy.tar.gz . && \
sudo tar -xzf deploy.tar.gz && \
mv /tmp/deploy.tar.gz . && \
tar -xzf deploy.tar.gz && \
echo '>> 重启 Docker 容器...' && \
sudo docker compose -f docker-compose.prod.yml up -d --build backend frontend && \
docker compose -f docker-compose.prod.yml up -d --build backend frontend && \
echo '>> 验证 nginx 代理配置...' && \
sleep 5 && \
if sudo docker exec inventory_ui_prod grep -q "inventory_api_prod" /etc/nginx/conf.d/default.conf; then \
if docker exec inventory_ui_prod grep -q "inventory_api_prod" /etc/nginx/conf.d/default.conf; then \
echo '✅ nginx 代理已指向 inventory_api_prod'; \
else \
echo '⚠️ 警告: nginx 代理仍是 backend可能出现 /api/ 404请检查 nginx.conf'; \
@ -110,7 +110,7 @@ ssh -t $SERVER "cd $REMOTE_DIR && \
else \
echo "✅ API 连通性正常 HTTP=$API_CODE"; \
fi && \
sudo rm deploy.tar.gz"
rm deploy.tar.gz"
if [ $? -ne 0 ]; then
echo "❌ 远端启动失败,请检查 Docker 日志!"
@ -121,4 +121,4 @@ else
fi
# 扫尾清理本地文件
rm -f deploy.tar.gz
rm -f deploy.tar.gz