-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathstart_server.sh
More file actions
executable file
·287 lines (252 loc) · 8.26 KB
/
Copy pathstart_server.sh
File metadata and controls
executable file
·287 lines (252 loc) · 8.26 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
#!/bin/bash
# 语雀 MCP 代理服务器启动脚本
# 功能:检测服务是否运行,如果没有则自动启动
# 支持三种启动模式:异步版本、同步版本和自动启动服务
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="$SCRIPT_DIR/yuque-config.env"
PORT=${PORT:-3000}
# 脚本名称配置
ASYNC_SCRIPT="app_async.py"
SYNC_SCRIPT="app.py"
AUTO_START_SCRIPT="auto_start_server.py"
# 默认使用异步版本
SCRIPT_NAME="$ASYNC_SCRIPT"
# PID 和日志文件配置
PID_FILE="/tmp/yuque-proxy.pid"
LOG_FILE="/tmp/yuque-proxy.log"
# 加载配置文件(如果存在)
load_config() {
if [ -f "$CONFIG_FILE" ]; then
echo "📝 加载配置文件: $CONFIG_FILE"
# 读取配置文件并导出环境变量(忽略注释和空行)
set -a
source "$CONFIG_FILE" 2>/dev/null
set +a
fi
}
# 检查服务是否运行
check_server() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
# 检查端口是否被占用
if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
return 0 # 服务正在运行
fi
fi
# PID 文件存在但进程不存在,清理
rm -f "$PID_FILE"
fi
return 1 # 服务未运行
}
# 启动服务
start_server() {
if check_server; then
echo "✅ 服务已在运行中 (PID: $(cat $PID_FILE))"
return 0
fi
# 加载配置文件
load_config
echo "🚀 正在启动语雀 MCP 代理服务器..."
cd "$SCRIPT_DIR"
# 检查 Token 配置
if [ -z "$YUQUE_TOKEN" ]; then
echo "⚠️ 警告: 未设置 YUQUE_TOKEN 环境变量"
echo " 提示: 可以通过以下方式配置:"
echo " 1. 创建配置文件: $CONFIG_FILE"
echo " 2. 设置环境变量: export YUQUE_TOKEN=your-token"
echo " 3. 在 Chatbox 的 HTTP Header 中配置: X-Yuque-Token"
echo ""
echo " 继续启动服务(Token 可通过 HTTP Header 提供)..."
fi
# 启动服务(后台运行,传递环境变量)
nohup env YUQUE_TOKEN="$YUQUE_TOKEN" PORT="$PORT" python3 "$SCRIPT_NAME" > "$LOG_FILE" 2>&1 &
PID=$!
# 保存 PID
echo $PID > "$PID_FILE"
# 等待服务启动
sleep 2
# 检查是否启动成功
if check_server; then
echo "✅ 服务启动成功!"
echo " PID: $PID"
echo " 端口: $PORT"
echo " 日志: $LOG_FILE"
echo " 健康检查: http://localhost:$PORT/health"
return 0
else
echo "❌ 服务启动失败,请查看日志: $LOG_FILE"
rm -f "$PID_FILE"
return 1
fi
}
# 停止服务
stop_server() {
if [ ! -f "$PID_FILE" ]; then
echo "⚠️ 服务未运行"
return 0
fi
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
echo "🛑 正在停止服务 (PID: $PID)..."
kill "$PID"
sleep 1
# 强制杀死(如果还在运行)
if ps -p "$PID" > /dev/null 2>&1; then
kill -9 "$PID"
fi
rm -f "$PID_FILE"
echo "✅ 服务已停止"
else
echo "⚠️ PID 文件存在但进程不存在,清理 PID 文件"
rm -f "$PID_FILE"
fi
}
# 查看状态
status_server() {
# 加载配置文件以显示配置信息
load_config
if check_server; then
PID=$(cat "$PID_FILE")
echo "✅ 服务正在运行"
echo " PID: $PID"
echo " 端口: $PORT"
echo " 日志: $LOG_FILE"
# 显示 Token 配置状态
if [ -n "$YUQUE_TOKEN" ]; then
echo " Token: 已配置(环境变量)"
elif [ -f "$CONFIG_FILE" ]; then
echo " Token: 已配置(配置文件)"
else
echo " Token: 未配置(需通过 HTTP Header 提供)"
fi
# 测试健康检查
if command -v curl > /dev/null 2>&1; then
echo ""
echo "📊 健康检查:"
curl -s http://localhost:$PORT/health | python3 -m json.tool 2>/dev/null || echo " 无法连接"
fi
else
echo "❌ 服务未运行"
fi
}
# 查看日志
view_logs() {
if [ -f "$LOG_FILE" ]; then
tail -f "$LOG_FILE"
else
echo "⚠️ 日志文件不存在: $LOG_FILE"
fi
}
# 启动自动启动服务
start_auto_server() {
echo "🚀 正在启动自动启动服务..."
cd "$SCRIPT_DIR"
# 检查 Token 配置
if [ -z "$YUQUE_TOKEN" ]; then
echo "⚠️ 警告: 未设置 YUQUE_TOKEN 环境变量"
echo " 提示: 可以通过以下方式配置:"
echo " 1. 创建配置文件: $CONFIG_FILE"
echo " 2. 设置环境变量: export YUQUE_TOKEN=your-token"
echo " 3. 在 Chatbox 的 HTTP Header 中配置: X-Yuque-Token"
echo ""
echo " 继续启动服务(Token 可通过 HTTP Header 提供)..."
fi
# 启动自动启动服务(前台运行,便于查看日志)
python3 "$AUTO_START_SCRIPT"
}
# 主函数
main() {
case "${1:-start}" in
start)
# 支持模式参数:async, sync, auto
mode="${2:-async}"
case "$mode" in
async)
SCRIPT_NAME="$ASYNC_SCRIPT"
echo "🔄 选择模式: 异步版本"
;;
sync)
SCRIPT_NAME="$SYNC_SCRIPT"
echo "🔄 选择模式: 同步版本"
;;
auto)
start_auto_server
return
;;
*)
echo "⚠️ 无效模式: $mode,默认使用异步版本"
SCRIPT_NAME="$ASYNC_SCRIPT"
;;
esac
start_server
;;
stop)
stop_server
;;
restart)
stop_server
sleep 1
start_server
;;
status)
status_server
;;
logs)
view_logs
;;
config)
# 创建配置文件
if [ -f "$CONFIG_FILE" ]; then
echo "📝 配置文件已存在: $CONFIG_FILE"
echo ""
echo "当前配置:"
cat "$CONFIG_FILE"
else
echo "📝 创建配置文件: $CONFIG_FILE"
cat > "$CONFIG_FILE" << EOF
# 语雀 MCP 代理配置文件
# 此文件包含敏感信息,请勿提交到代码仓库
# 语雀 Token(必需)
# 获取方式:语雀设置 > 个人设置 > Token
YUQUE_TOKEN=your-token-here
# 服务端口(可选,默认 3000)
PORT=3000
# Redis 配置(可选,用于缓存)
# REDIS_URL=redis://localhost:6379/0
EOF
chmod 600 "$CONFIG_FILE"
echo "✅ 配置文件已创建"
echo "⚠️ 请编辑 $CONFIG_FILE 并填入您的 Token"
fi
;;
auto)
# 快捷命令:启动自动启动服务
start_auto_server
;;
*)
echo "用法: $0 {start|stop|restart|status|logs|config|auto} [mode]"
echo ""
echo "命令说明:"
echo " start - 启动服务(如果未运行)"
echo " stop - 停止服务"
echo " restart - 重启服务"
echo " status - 查看服务状态"
echo " logs - 查看日志(实时)"
echo " config - 创建/查看配置文件"
echo " auto - 启动自动启动服务"
echo ""
echo "启动模式:"
echo " async - 异步版本(推荐,使用 FastAPI)"
echo " sync - 同步版本(使用 Flask)"
echo " auto - 自动启动服务(监听请求并自动启动)"
echo ""
echo "示例:"
echo " $0 start async # 启动异步版本"
echo " $0 start sync # 启动同步版本"
echo " $0 auto # 启动自动启动服务"
exit 1
;;
esac
}
main "$@"