70 lines
2.9 KiB
Bash
Executable File
70 lines
2.9 KiB
Bash
Executable File
#!/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 "✅ 全量部署完成!" |