Files
track/deploy_full.sh

91 lines
3.4 KiB
Bash

#!/bin/bash
# ============================================================
# Track 生产流转系统 — 全量部署脚本(含数据库同步)
# 服务器: 172.16.0.198
# 路径: /opt/Track
# ⚠️ 会覆盖生产数据库!请确认后再执行!
# ============================================================
set -e
SERVER="dxc@172.16.0.198"
REMOTE_DIR="/opt/Track"
TIMESTAMP=$(date +%Y%m%d_%H%M)
REMOTE_BACKUP_DIR="$REMOTE_DIR/backups/$TIMESTAMP"
echo "⚠️⚠️⚠️ 警告:此操作将覆盖生产数据库!⚠️⚠️⚠️"
read -p "确认继续?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
# 1. 远端全量备份
echo "[1/5] 服务器全量备份..."
ssh -t $SERVER "sudo mkdir -p $REMOTE_BACKUP_DIR && \
cd $REMOTE_DIR && \
echo '>> 导出线上数据库...' && \
sudo sh -c 'docker exec track_db_prod pg_dumpall -c -U track | gzip > $REMOTE_BACKUP_DIR/db_backup.sql.gz' && \
echo '>> 备份代码...' && \
sudo tar -czf $REMOTE_BACKUP_DIR/code_backup.tar.gz \
backend frontend docker-compose.prod.yml 2>/dev/null || true && \
echo '>> 保留最近 3 个备份...' && \
cd $REMOTE_DIR/backups && \
sudo sh -c 'ls -dt */ 2>/dev/null | tail -n +4 | xargs -I {} rm -rf {} || true'"
if [ $? -ne 0 ]; then echo "❌ 备份失败,终止!"; exit 1; fi
# 2. 导出本地数据库
echo "[2/5] 导出本地数据库..."
docker exec track_db pg_dumpall -c -U track | gzip > db_sync.sql.gz
echo ">> 数据库导出完成"
# 3. 本地打包
echo "[3/5] 本地打包代码+数据库..."
tar -czf deploy_full.tar.gz \
--exclude="backend/venv" \
--exclude="backend/.venv" \
--exclude="backend/__pycache__" \
--exclude="backend/*.pyc" \
--exclude="backend/.env" \
--exclude="frontend/node_modules" \
--exclude="frontend/dist" \
--exclude=".git" \
--exclude=".idea" \
--exclude=".vscode" \
--exclude="track-uniapp/node_modules" \
--exclude="track-uniapp/dist" \
--exclude="track-uniapp/unpackage" \
--exclude="backups" \
backend frontend docker-compose.prod.yml db_sync.sql.gz
FILESIZE=$(stat -c%s "deploy_full.tar.gz" 2>/dev/null || stat -f%z "deploy_full.tar.gz")
echo ">> 打包完成: $((FILESIZE / 1024 / 1024)) MB"
# 4. 上传
echo "[4/5] 上传到服务器..."
scp deploy_full.tar.gz $SERVER:/tmp/deploy_full.tar.gz
if [ $? -ne 0 ]; then echo "❌ 上传失败!"; rm -f deploy_full.tar.gz db_sync.sql.gz; exit 1; fi
# 5. 替换+导入+重启
echo "[5/5] 服务器部署..."
ssh -t $SERVER "cd $REMOTE_DIR && \
echo '>> 移除旧备份...' && \
sudo rm -rf backend_old frontend_old && \
echo '>> 保留当前为 old...' && \
(sudo mv backend backend_old 2>/dev/null || true) && \
(sudo mv frontend frontend_old 2>/dev/null || true) && \
echo '>> 解压新代码...' && \
sudo mv /tmp/deploy_full.tar.gz . && \
sudo tar -xzf deploy_full.tar.gz && \
echo '>> 重启 Docker...' && \
sudo docker compose -f docker-compose.prod.yml up -d --build && \
echo '>> 导入数据库...' && \
sudo sh -c 'gunzip -c db_sync.sql.gz | docker exec -i track_db_prod psql -U track -d track_production' && \
sudo rm deploy_full.tar.gz db_sync.sql.gz && \
echo '>> ✅ 全量部署完成!'"
rm -f deploy_full.tar.gz db_sync.sql.gz
echo "==================================================="
echo "✅ 全量部署完成!访问 http://172.16.0.198:8010"
echo "==================================================="