-
Notifications
You must be signed in to change notification settings - Fork 103
Expand file tree
/
Copy pathstart.sh
More file actions
executable file
·294 lines (242 loc) · 8.24 KB
/
start.sh
File metadata and controls
executable file
·294 lines (242 loc) · 8.24 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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#!/bin/bash
# Todo for AI - 一键启动脚本
# 自动杀死之前的实例并启动前后端服务
set -e
# 检查是否在Service模式下运行
if [ "${TODOFORAI_SERVICE_MODE}" = "daemon" ]; then
echo "检测到Service模式,使用专用启动脚本..."
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
exec "$SCRIPT_DIR/start-service.sh" "$@"
fi
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$PROJECT_ROOT/todo-for-ai-api-server"
FRONTEND_DIR="$PROJECT_ROOT/todo-for-ai-webpage"
# 端口配置
BACKEND_PORT=50110
FRONTEND_PORT=50111
PREVIEW_PORT=50112
echo -e "${BLUE}🚀 Todo for AI - 一键启动脚本${NC}"
echo "项目根目录: $PROJECT_ROOT"
echo "后端端口: $BACKEND_PORT"
echo "前端端口: $FRONTEND_PORT"
echo "预览端口: $PREVIEW_PORT"
echo ""
# 杀死之前的进程
kill_previous_processes() {
echo -e "${YELLOW}🔪 杀死之前的进程...${NC}"
# 杀死占用端口的进程
local ports=($BACKEND_PORT $FRONTEND_PORT $PREVIEW_PORT)
for port in "${ports[@]}"; do
local pids=$(lsof -ti:$port 2>/dev/null || true)
if [ ! -z "$pids" ]; then
echo " 杀死端口 $port 上的进程: $pids"
echo "$pids" | xargs kill -9 2>/dev/null || true
fi
done
# 杀死可能的Python和Node进程
echo " 杀死相关的Python进程..."
pkill -f "python.*app.py" 2>/dev/null || true
pkill -f "python.*simple_mcp_server.py" 2>/dev/null || true
echo " 杀死相关的Node进程..."
pkill -f "vite.*dev" 2>/dev/null || true
pkill -f "node.*vite" 2>/dev/null || true
# 等待进程完全退出
sleep 2
echo -e "${GREEN}✅ 进程清理完成${NC}"
}
# 检查依赖
check_dependencies() {
echo -e "${YELLOW}📋 检查依赖...${NC}"
# 检查 Node.js
if ! command -v node &> /dev/null; then
echo -e "${RED}❌ Node.js 未安装${NC}"
exit 1
fi
echo -e "${GREEN}✅ Node.js: $(node --version)${NC}"
# 检查 Python
if ! command -v python3 &> /dev/null; then
echo -e "${RED}❌ Python3 未安装${NC}"
exit 1
fi
echo -e "${GREEN}✅ Python3: $(python3 --version)${NC}"
# 检查 MySQL
if ! command -v mysql &> /dev/null; then
echo -e "${YELLOW}⚠️ MySQL 命令行工具未找到,请确保 MySQL 服务正在运行${NC}"
else
echo -e "${GREEN}✅ MySQL 命令行工具已安装${NC}"
fi
}
# 初始化后端
init_backend() {
echo -e "${CYAN}🔧 初始化后端环境...${NC}"
cd "$BACKEND_DIR"
# 检查虚拟环境
if [ ! -d "venv" ]; then
echo "创建 Python 虚拟环境..."
python3 -m venv venv
fi
# 激活虚拟环境
source venv/bin/activate
# 安装依赖
echo "检查 Python 依赖..."
if ! pip install -r requirements.txt; then
echo -e "${RED}❌ Python依赖安装失败${NC}"
exit 1
fi
# 检查数据库连接
echo "跳过数据库检查(将在启动时自动创建表)..."
echo -e "${GREEN}✅ 后端环境初始化完成${NC}"
}
# 初始化前端
init_frontend() {
echo -e "${CYAN}🎨 初始化前端环境...${NC}"
cd "$FRONTEND_DIR"
# 检查依赖
if [ ! -d "node_modules" ]; then
echo "安装前端依赖..."
if ! npm install; then
echo -e "${RED}❌ 前端依赖安装失败${NC}"
exit 1
fi
else
echo "前端依赖已安装,跳过..."
fi
echo -e "${GREEN}✅ 前端环境初始化完成${NC}"
}
# 启动后端服务
start_backend() {
echo -e "${CYAN}🔧 启动后端服务...${NC}"
cd "$BACKEND_DIR"
source venv/bin/activate
# 设置环境变量
export PORT=$BACKEND_PORT
export HOST=0.0.0.0
export FLASK_ENV=development
export FLASK_DEBUG=1
# 后台启动
nohup python app.py > ../logs/todo-for-ai-api-server.log 2>&1 &
BACKEND_PID=$!
# 保存PID
echo $BACKEND_PID > "$PROJECT_ROOT/.todo-for-ai-api-server.pid"
echo "后端服务 PID: $BACKEND_PID"
# 等待服务启动
echo "等待后端服务启动..."
for i in {1..30}; do
if curl -s http://localhost:$BACKEND_PORT/health > /dev/null 2>&1; then
echo -e "${GREEN}✅ 后端服务启动成功 (http://localhost:$BACKEND_PORT)${NC}"
return 0
fi
sleep 1
done
echo -e "${RED}❌ 后端服务启动失败${NC}"
return 1
}
# 启动前端服务
start_frontend() {
echo -e "${CYAN}🎨 启动前端服务...${NC}"
cd "$FRONTEND_DIR"
# 后台启动
nohup npm run dev > ../logs/todo-for-ai-webpage.log 2>&1 &
FRONTEND_PID=$!
# 保存PID
echo $FRONTEND_PID > "$PROJECT_ROOT/.todo-for-ai-webpage.pid"
echo "前端服务 PID: $FRONTEND_PID"
# 等待服务启动
echo "等待前端服务启动..."
for i in {1..30}; do
if curl -s http://localhost:$FRONTEND_PORT > /dev/null 2>&1; then
echo -e "${GREEN}✅ 前端服务启动成功 (http://localhost:$FRONTEND_PORT)${NC}"
return 0
fi
sleep 1
done
echo -e "${YELLOW}⚠️ 前端服务可能还在启动中...${NC}"
return 0
}
# 显示服务状态
show_status() {
echo ""
echo -e "${BLUE}📊 服务状态:${NC}"
echo "=================================="
echo -e "${GREEN}🌐 前端服务: http://localhost:$FRONTEND_PORT${NC}"
echo -e "${GREEN}🔧 后端API: http://localhost:$BACKEND_PORT${NC}"
echo -e "${GREEN}📚 API文档: http://localhost:$BACKEND_PORT/api/docs${NC}"
echo -e "${GREEN}🏥 健康检查: http://localhost:$BACKEND_PORT/health${NC}"
echo "=================================="
echo -e "${YELLOW}📝 日志文件:${NC}"
echo " 后端日志: $PROJECT_ROOT/logs/todo-for-ai-api-server.log"
echo " 前端日志: $PROJECT_ROOT/logs/todo-for-ai-webpage.log"
echo "=================================="
echo -e "${BLUE}💡 使用提示:${NC}"
echo " - 查看后端日志: tail -f logs/todo-for-ai-api-server.log"
echo " - 查看前端日志: tail -f logs/todo-for-ai-webpage.log"
echo " - 停止服务: ./scripts/stop_all.sh"
echo " - 检查状态: ./scripts/status.sh"
echo "=================================="
}
# 主函数
main() {
# 创建日志目录
mkdir -p "$PROJECT_ROOT/logs"
# 执行启动流程
kill_previous_processes
check_dependencies
init_backend
init_frontend
if start_backend && start_frontend; then
echo ""
echo -e "${GREEN}🎉 系统启动完成!${NC}"
show_status
# 直接显示实时日志
echo ""
echo -e "${BLUE}📋 实时日志 (Ctrl+C 退出):${NC}"
tail -f "$PROJECT_ROOT/logs/todo-for-ai-api-server.log" "$PROJECT_ROOT/logs/todo-for-ai-webpage.log" 2>/dev/null || true
else
echo -e "${RED}❌ 系统启动失败${NC}"
exit 1
fi
}
# 清理函数
cleanup() {
echo -e "\n${YELLOW}🛑 正在停止服务...${NC}"
# 停止服务
if [ -f "$PROJECT_ROOT/.todo-for-ai-api-server.pid" ]; then
kill $(cat "$PROJECT_ROOT/.todo-for-ai-api-server.pid") 2>/dev/null || true
rm -f "$PROJECT_ROOT/.todo-for-ai-api-server.pid"
fi
if [ -f "$PROJECT_ROOT/.todo-for-ai-webpage.pid" ]; then
kill $(cat "$PROJECT_ROOT/.todo-for-ai-webpage.pid") 2>/dev/null || true
rm -f "$PROJECT_ROOT/.todo-for-ai-webpage.pid"
fi
echo -e "${GREEN}✅ 服务已停止${NC}"
exit 0
}
# 设置信号处理
trap cleanup SIGINT SIGTERM
# 检查参数
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
echo "用法: $0 [选项]"
echo ""
echo "Todo for AI 一键启动脚本"
echo ""
echo "选项:"
echo " --help, -h 显示此帮助信息"
echo ""
echo "功能:"
echo " - 自动杀死之前的进程实例"
echo " - 检查和安装依赖"
echo " - 启动后端服务 (端口 $BACKEND_PORT)"
echo " - 启动前端服务 (端口 $FRONTEND_PORT)"
echo " - 显示服务状态和日志"
exit 0
fi
# 运行主函数
main