deploy: deploy.sh 完整7步部署流程(代码+迁移+mock数据+AI分析+成交+重启+验证)
This commit is contained in:
@@ -11,6 +11,10 @@ REMOTE_USER="root"
|
||||
REMOTE_PATH="/opt/wxsales"
|
||||
REMOTE_DEMO="${REMOTE_PATH}/demo"
|
||||
|
||||
# 数据库连接参数
|
||||
DB_DSN="host=127.0.0.1 port=5432 dbname=wxchat_sales user=postgres password=Why_701208"
|
||||
DB_ENV="DB_HOST=127.0.0.1 DB_PORT=5432 DB_USER=postgres DB_PASSWORD=Why_701208 DB_NAME=wxchat_sales"
|
||||
|
||||
echo "=========================================="
|
||||
echo " 微信销售管理系统 - 远程部署"
|
||||
echo "=========================================="
|
||||
@@ -18,7 +22,7 @@ echo " 目标: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"
|
||||
echo ""
|
||||
|
||||
# 1. Git 提交推送
|
||||
echo "[1/5] Git 提交推送..."
|
||||
echo "[1/7] Git 提交推送..."
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
@@ -32,22 +36,108 @@ fi
|
||||
|
||||
# 2. 同步代码到远程
|
||||
echo ""
|
||||
echo "[2/5] 同步代码到远程服务器..."
|
||||
echo "[2/7] 同步代码到远程服务器..."
|
||||
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_PATH}"
|
||||
rsync -avz --delete --exclude='db/data' --exclude='db/socket' --exclude='__pycache__' \
|
||||
--exclude='.git' --exclude='web.log' --exclude='.run.pid' \
|
||||
"$(dirname "$0")/demo/" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DEMO}/"
|
||||
echo " ✓ 代码已同步"
|
||||
|
||||
# 3. 远程执行数据库迁移 + 重启服务
|
||||
# 3. 远程执行数据库迁移
|
||||
echo ""
|
||||
echo "[3/5] 远程数据库迁移..."
|
||||
echo "[3/7] 远程数据库迁移..."
|
||||
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} bash ${REMOTE_DEMO}/deploy_remote.sh
|
||||
echo " ✓ 数据库迁移完成"
|
||||
|
||||
# 4. 重启 Web 服务
|
||||
# 4. 同步 Mock 数据 + AI 分析
|
||||
echo ""
|
||||
echo "[4/5] 重启 Web 服务..."
|
||||
echo "[4/7] 同步 Mock 数据 + AI 分析..."
|
||||
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "
|
||||
cd ${REMOTE_DEMO}
|
||||
# 清空旧数据(保留 product/salesperson 预置数据)
|
||||
su - postgres -c \"psql -h /run/postgresql -p 5432 -d wxchat_sales -c 'TRUNCATE message, conversation, contact, customer, deal RESTART IDENTITY CASCADE;'\" 2>/dev/null
|
||||
echo ' ✓ 旧数据已清空'
|
||||
|
||||
# 生成 3 个销售的 mock 对话数据
|
||||
for spid in 1 2 3; do
|
||||
/usr/bin/python3 agent/mock_sync.py --salesperson-id \$spid --dsn '${DB_DSN}' 2>&1 | grep -E '\"contacts\"|\"new_messages\"'
|
||||
done
|
||||
echo ' ✓ Mock 对话数据已生成'
|
||||
|
||||
# AI 分析识别客户
|
||||
/usr/bin/python3 ai/analyze.py --mode rule --force --dsn '${DB_DSN}' 2>&1 | python3 -c '
|
||||
import sys, json
|
||||
d = json.load(sys.stdin)
|
||||
print(f\" ✓ AI分析完成: {d[\"customers_identified\"]} 个客户, {d[\"summaries_generated\"]} 条摘要\")
|
||||
'
|
||||
"
|
||||
echo " ✓ Mock 数据 + AI 分析完成"
|
||||
|
||||
# 5. 预置成交记录
|
||||
echo ""
|
||||
echo "[5/7] 预置成交记录..."
|
||||
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "
|
||||
su - postgres -c \"psql -h /run/postgresql -p 5432 -d wxchat_sales\" <<'DEALSQL'
|
||||
-- 儿童益生菌预置成交
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 1, '益童宝益生菌 3盒套餐', 798, '2026-07-05', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 1 AND cu.salesperson_id = 1 AND cu.customer_name LIKE '辰辰%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝益生菌 3盒套餐' AND deal_date = '2026-07-05');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 1, '益童宝益生菌 3盒套餐', 798, '2026-07-08', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 1 AND cu.salesperson_id = 1 AND cu.customer_name LIKE '依依%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝益生菌 3盒套餐' AND deal_date = '2026-07-08');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 3, '益童宝益生菌 6盒套餐', 1499, '2026-07-12', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 1 AND cu.salesperson_id = 1 AND cu.customer_name LIKE '糖糖%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝益生菌 6盒套餐' AND deal_date = '2026-07-12');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 2, '益童宝益生菌 单盒', 298, '2026-07-10', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 2 AND cu.salesperson_id = 2 AND cu.customer_name LIKE '甜甜%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝益生菌 单盒' AND deal_date = '2026-07-10');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 1, '益童宝益生菌 3盒套餐', 798, '2026-07-06', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 3 AND cu.salesperson_id = 3 AND cu.customer_name LIKE '阳阳%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝益生菌 3盒套餐' AND deal_date = '2026-07-06');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 1, '益童宝益生菌 3盒套餐', 798, '2026-06-20', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 3 AND cu.salesperson_id = 3 AND cu.customer_name LIKE '糖糖%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '益童宝益生菌 3盒套餐' AND deal_date = '2026-06-20');
|
||||
|
||||
-- 减肥益生菌预置成交
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 4, '纤益益生菌 2盒套餐', 656, '2026-07-08', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 2 AND cu.salesperson_id = 2 AND cu.customer_name LIKE '小鹿%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '纤益益生菌 2盒套餐' AND deal_date = '2026-07-08');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 4, '纤益益生菌 2盒套餐', 656, '2026-07-14', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 3 AND cu.salesperson_id = 3 AND cu.customer_name LIKE '阿狸%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '纤益益生菌 2盒套餐' AND deal_date = '2026-07-14');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 5, '纤益益生菌 单盒', 328, '2026-07-10', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 2 AND cu.salesperson_id = 2 AND cu.customer_name LIKE '小鹿%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '纤益益生菌 单盒' AND deal_date = '2026-07-10');
|
||||
|
||||
INSERT INTO deal (salesperson_id, customer_id, product_id, product_name, amount, deal_date, status)
|
||||
SELECT s.id, cu.id, 4, '纤益益生菌 2盒套餐', 656, '2026-07-13', 'closed'
|
||||
FROM salesperson s, customer cu WHERE s.id = 3 AND cu.salesperson_id = 3 AND cu.customer_name LIKE '小鹿%'
|
||||
AND NOT EXISTS (SELECT 1 FROM deal WHERE customer_id = cu.id AND product_name = '纤益益生菌 2盒套餐' AND deal_date = '2026-07-13');
|
||||
|
||||
SELECT count(*) AS total_deals FROM deal;
|
||||
DEALSQL
|
||||
"
|
||||
echo " ✓ 预置成交记录已插入"
|
||||
|
||||
# 6. 重启 Web 服务
|
||||
echo ""
|
||||
echo "[6/7] 重启 Web 服务..."
|
||||
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "
|
||||
# 停止旧进程
|
||||
if lsof -ti:8770 >/dev/null 2>&1; then
|
||||
@@ -56,7 +146,7 @@ ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "
|
||||
fi
|
||||
# 启动新进程
|
||||
cd ${REMOTE_DEMO}
|
||||
DB_HOST=127.0.0.1 DB_PORT=5432 DB_USER=postgres DB_PASSWORD=Why_701208 DB_NAME=wxchat_sales \
|
||||
${DB_ENV} \
|
||||
nohup /usr/bin/python3 -m uvicorn web.server:app --host 127.0.0.1 --port 8770 \
|
||||
> ${REMOTE_DEMO}/web.log 2>&1 &
|
||||
sleep 2
|
||||
@@ -69,9 +159,9 @@ ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "
|
||||
fi
|
||||
"
|
||||
|
||||
# 5. 验证
|
||||
# 7. 验证
|
||||
echo ""
|
||||
echo "[5/5] 验证..."
|
||||
echo "[7/7] 验证..."
|
||||
if curl -s --max-time 10 http://sale.all8ai.top/api/products | grep -q '"id"' 2>/dev/null; then
|
||||
echo " ✓ 域名访问正常: http://sale.all8ai.top"
|
||||
else
|
||||
@@ -80,7 +170,14 @@ fi
|
||||
|
||||
PRODUCT_COUNT=$(ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} \
|
||||
"curl -s http://127.0.0.1:8770/api/products | python3 -c 'import sys,json; print(len(json.load(sys.stdin)))'" 2>/dev/null || echo "?")
|
||||
CUSTOMER_COUNT=$(ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} \
|
||||
"curl -s http://127.0.0.1:8770/api/customers | python3 -c 'import sys,json; print(len(json.load(sys.stdin)))'" 2>/dev/null || echo "?")
|
||||
DEAL_COUNT=$(ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} \
|
||||
"su - postgres -c \"psql -h /run/postgresql -p 5432 -d wxchat_sales -t -c 'SELECT count(*) FROM deal;'\"" 2>/dev/null | xargs || echo "?")
|
||||
|
||||
echo " ✓ 产品数量: ${PRODUCT_COUNT}"
|
||||
echo " ✓ 客户数量: ${CUSTOMER_COUNT}"
|
||||
echo " ✓ 成交记录: ${DEAL_COUNT}"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
|
||||
Reference in New Issue
Block a user