-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathredeploy.sh
More file actions
executable file
·177 lines (151 loc) · 5.13 KB
/
redeploy.sh
File metadata and controls
executable file
·177 lines (151 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/bash
#
# 重新部署脚本
# 用法: ./redeploy.sh [--no-cache] [--keep-data]
#
# 选项:
# --no-cache 构建时不使用缓存
# --keep-data 保留数据库数据(默认会清理)
#
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置
COMPOSE_FILE="docker-compose.ec2.yml"
API_CONTAINER="hierarchical-agents-api"
MYSQL_CONTAINER="hierarchical-agents-mysql"
HEALTH_TIMEOUT=60
HEALTH_INTERVAL=2
# 加载 .env 文件(如果存在)
if [ -f .env ]; then
export $(grep -v '^#' .env | xargs)
fi
# 使用环境变量或默认值(与 docker-compose.yml 保持一致,默认 8080)
API_PORT="${API_EXTERNAL_PORT:-8080}"
HEALTH_URL="http://localhost:${API_PORT}/health"
# 解析参数
NO_CACHE=""
KEEP_DATA=""
for arg in "$@"; do
case $arg in
--no-cache)
NO_CACHE="--no-cache"
shift
;;
--keep-data)
KEEP_DATA="true"
shift
;;
esac
done
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} 重新部署 AIOps Executor ${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# 1. 停止服务并删除容器
echo -e "${YELLOW}[1/6] 停止服务并删除容器...${NC}"
if docker-compose -f $COMPOSE_FILE ps -q 2>/dev/null | grep -q .; then
if [ -n "$KEEP_DATA" ]; then
# 只删除容器,保留数据卷
docker-compose -f $COMPOSE_FILE down
echo -e "${GREEN} 服务已停止,容器已删除(保留数据)${NC}"
else
# 删除容器和数据卷(默认)
docker-compose -f $COMPOSE_FILE down -v
echo -e "${GREEN} 服务已停止,容器和数据卷已删除${NC}"
fi
else
echo -e "${GREEN} 服务未运行${NC}"
fi
# 强制删除数据库容器(如果存在)
if docker ps -a -q -f "name=$MYSQL_CONTAINER" | grep -q .; then
docker rm -f $MYSQL_CONTAINER 2>/dev/null || true
echo -e "${GREEN} 数据库容器已删除${NC}"
fi
# 强制删除 API 容器(如果存在)
if docker ps -a -q -f "name=$API_CONTAINER" | grep -q .; then
docker rm -f $API_CONTAINER 2>/dev/null || true
echo -e "${GREEN} API 容器已删除${NC}"
fi
echo ""
# 2. 删除项目构建的镜像(不删除基础镜像如 mysql:8.0, python:3.12-slim)
echo -e "${YELLOW}[2/6] 删除项目镜像...${NC}"
# 获取项目构建的 API 镜像名称
PROJECT_NAME=$(basename "$(pwd)")
API_IMAGE="${PROJECT_NAME}-api"
if docker images -q "$API_IMAGE" 2>/dev/null | grep -q .; then
docker rmi -f "$API_IMAGE" 2>/dev/null || true
echo -e "${GREEN} 镜像 $API_IMAGE 已删除${NC}"
else
echo -e "${GREEN} 镜像 $API_IMAGE 不存在,跳过${NC}"
fi
# 清理构建产生的悬空镜像(不影响基础镜像)
DANGLING=$(docker images -f "dangling=true" -q 2>/dev/null)
if [ -n "$DANGLING" ]; then
echo -e " 清理悬空镜像..."
docker rmi $DANGLING 2>/dev/null || true
fi
echo ""
# 3. 重新构建镜像
echo -e "${YELLOW}[3/6] 重新构建镜像...${NC}"
if [ -n "$NO_CACHE" ]; then
echo -e " 使用 --no-cache 模式"
fi
docker-compose -f $COMPOSE_FILE build $NO_CACHE
echo -e "${GREEN} 镜像构建完成${NC}"
echo ""
# 4. 启动服务
echo -e "${YELLOW}[4/6] 启动服务...${NC}"
docker-compose -f $COMPOSE_FILE up -d
echo -e "${GREEN} 服务已启动${NC}"
echo ""
# 5. 等待数据库就绪
echo -e "${YELLOW}[5/6] 等待数据库就绪...${NC}"
sleep 5
echo -e "${GREEN} 数据库启动中...${NC}"
echo ""
# 6. 健康检查
echo -e "${YELLOW}[6/6] API 健康检查...${NC}"
echo -e " 等待服务就绪 (最多 ${HEALTH_TIMEOUT}s)..."
elapsed=0
while [ $elapsed -lt $HEALTH_TIMEOUT ]; do
# 检查容器状态
if ! docker ps -q -f "name=$API_CONTAINER" | grep -q .; then
echo -e "${RED} 容器未运行,检查日志:${NC}"
docker-compose -f $COMPOSE_FILE logs --tail=20 api
exit 1
fi
# 检查健康接口
response=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_URL 2>/dev/null || echo "000")
if [ "$response" = "200" ]; then
echo -e "${GREEN} 健康检查通过!${NC}"
echo ""
# 显示健康检查响应
echo -e "${BLUE}健康检查响应:${NC}"
curl -s $HEALTH_URL | python3 -m json.tool 2>/dev/null || curl -s $HEALTH_URL
echo ""
# 显示容器状态
echo -e "${BLUE}容器状态:${NC}"
docker-compose -f $COMPOSE_FILE ps
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} 部署成功! ${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e "API 地址: http://localhost:${API_PORT}"
echo -e "健康检查: $HEALTH_URL"
exit 0
fi
sleep $HEALTH_INTERVAL
elapsed=$((elapsed + HEALTH_INTERVAL))
echo -e " 等待中... (${elapsed}s)"
done
# 健康检查超时
echo -e "${RED} 健康检查超时!${NC}"
echo ""
echo -e "${RED}容器日志:${NC}"
docker-compose -f $COMPOSE_FILE logs --tail=50 api
exit 1