-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathdev.sh
More file actions
executable file
·178 lines (153 loc) · 5.26 KB
/
Copy pathdev.sh
File metadata and controls
executable file
·178 lines (153 loc) · 5.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
#!/bin/bash
# 🦞 OpenClaw Buddy 快速开发/测试脚本 (隔离模式)
DEV_ROOT="temp-dev-test"
PID_FILE="/tmp/openclaw-buddy-dev.pid"
# 🦞 MacOS 开发环境路径补丁 (针对 Homebrew 与 /usr/local)
if [[ "$OSTYPE" == "darwin"* ]]; then
EXTRA_PATHS="/opt/homebrew/bin:/usr/local/bin"
IFS=':' read -ra ADDR <<< "$EXTRA_PATHS"
for p in "${ADDR[@]}"; do
if [[ ":$PATH:" != *":$p:"* ]] && [ -d "$p" ]; then
export PATH="$p:$PATH"
fi
done
fi
stop_and_clean() {
echo "🔍 检查端口 3000 占用情况..."
PORT_PID=$(lsof -ti :3000)
if [ ! -z "$PORT_PID" ]; then
echo "🛑 发现正在运行的服务 (PID: $PORT_PID),正在尝试停止..."
kill $PORT_PID
sleep 2
# 如果还在运行,暴力关掉
if ps -p $PORT_PID > /dev/null; then
echo "⚠️ 进程服务仍未退出,执行强制清理 (kill -9)..."
kill -9 $PORT_PID
fi
fi
# 兜底清理同名进程
pkill -f "openclaw-buddy-dev" 2>/dev/null
# 清理 PID 文件与临时环境
if [ -f "$PID_FILE" ]; then
rm -f "$PID_FILE"
fi
if [ -d "$DEV_ROOT" ]; then
echo "🧹 正在清理隔离任务环境 (保留数据与配置)..."
# 排除 data 目录和 env 文件,清理其余所有内容
find "$DEV_ROOT" -mindepth 1 -maxdepth 1 ! -name 'data' ! -name 'env' -exec rm -rf {} +
fi
}
# 如果输入参数为 stop,则执行停止并清理
if [ "$1" == "stop" ]; then
stop_and_clean
echo "✨ 停止并清理完成。"
exit 0
fi
echo "🛠️ 开始开发环境构建 (目标目录: $DEV_ROOT)..."
# 1. 停止旧进程并清理
stop_and_clean
# 2. 准备隔离目录
mkdir -p "$DEV_ROOT"
mkdir -p "$DEV_ROOT/logs"
mkdir -p "$DEV_ROOT/data"
mkdir -p "$DEV_ROOT/reports"
mkdir -p "$DEV_ROOT/backups"
# 3. 编译前端
if [ -d "web" ]; then
echo "🎨 正在编译前端..."
pushd web > /dev/null
# 确保 Vite 构建的 base 与后端 WEB_ROOT 一致,否则子路径部署会出现 /assets 404
WEB_ROOT_FOR_BUILD="/"
if [ -f "../$DEV_ROOT/env" ]; then
WEB_ROOT_FOR_BUILD=$(grep -E '^WEB_ROOT=' "../$DEV_ROOT/env" | head -n 1 | cut -d'=' -f2- | tr -d '"' | tr -d "'" )
fi
if [ -z "$WEB_ROOT_FOR_BUILD" ]; then
WEB_ROOT_FOR_BUILD="/"
fi
export VITE_WEB_ROOT="$WEB_ROOT_FOR_BUILD"
echo "🔧 VITE_WEB_ROOT=$VITE_WEB_ROOT"
npm run build
if [ $? -ne 0 ]; then
echo "❌ 前端项目编译失败!请检查 TypeScript 或 Lint 错误。"
popd > /dev/null
exit 1
fi
popd > /dev/null
# 校验产物目录
if [ ! -d "web/dist" ]; then
echo "❌ 找不到编译产物目录 (web/dist),编译可能未完整完成。"
exit 1
fi
echo "📦 正在同步前端资产到后端..."
mkdir -p internal/api/dist
rm -rf internal/api/dist/*
cp -r web/dist/* internal/api/dist/
fi
# 4. 编译后端到隔离目录
DEV_VERSION=$(cat VERSION 2>/dev/null || echo "dev")
echo "🏗️ 正在编译后端 (版本: $DEV_VERSION)..."
go build -ldflags="-X 'openclaw-buddy/internal/config.Version=${DEV_VERSION}'" -o "$DEV_ROOT/openclaw-buddy-dev" ./cmd/monitor/main.go
if [ $? -ne 0 ]; then
echo "❌ 编译失败!"
exit 1
fi
# 将版本文件同步到隔离目录,便于排查与展示
if [ -f "VERSION" ]; then
cp "VERSION" "$DEV_ROOT/VERSION"
fi
# 6. 生成隔离环境配置: $DEV_ROOT/env (仅在不存在时生成)
if [ ! -f "$DEV_ROOT/env" ]; then
echo "📝 生成隔离环境配置: $DEV_ROOT/env"
cat <<EOF > "$DEV_ROOT/env"
# [网络与访问]
# 默认端口 (3000)
WEB_PORT=3000
# 基础路径 (默认为 /, 若需配置如 /claw 则改为 /claw)
WEB_ROOT="/console/claw"
BUDDY_TOKEN="openclaw-buddy-2026"
PID_FILE="./openclaw-buddy.pid"
# [存储与目录]
# 隔离数据存储路径 (相对于执行路径)
DB_FILE="./data/guardian.db"
# OpenClaw 配置文件目录
OPENCLAW_CONFIG_DIR="~/.openclaw"
# 各类运行资产存放目录
BACKUP_DIR="./backups"
LOG_FILE="./logs/guardian.log"
REPORT_DIR="./reports"
# [监控策略]
# 监控轮询间隔 (秒)
CHECK_INTERVAL_SECONDS=60
# 网关健康检查端口
HEALTH_PORT=18789
# 最大容错重试次数
MAX_RETRIES=3
# [高级选项]
# 外部跳转链接 (可选)
EXTERNAL_DASHBOARD_URL=""
# 是否显示“外部工具”菜单组
SHOW_EXTERNAL_TOOLS=true
# [飞书通知 (可选)]
FEISHU_ENABLED=false
FEISHU_APP_ID=""
FEISHU_APP_SECRET=""
FEISHU_CHAT_ID=""
EOF
else
echo "📝 使用已存在的隔离环境配置: $DEV_ROOT/env"
fi
# 7. 切换到隔离目录启动服务
cd "$DEV_ROOT"
echo "🚀 启动服务..."
# 显式读取 env 中的变量并导出 (也可以由 Go 代码中的 godotenv.Load("env") 处理,但 PID 检查在 Load 之前)
export PID_FILE="./openclaw-buddy.pid"
nohup ./openclaw-buddy-dev > /dev/null 2>&1 &
NEW_PID=$!
echo $NEW_PID > "/tmp/openclaw-buddy-dev.pid"
echo "✅ 服务已在隔离环境启动 (PID: $NEW_PID)"
echo "🌐 访问地址: http://localhost:3000"
echo "🔑 认证令牌 (Token): $(grep BUDDY_TOKEN env | cut -d'=' -f2 | tr -d '"')"
echo "--------------------------------------------------"
echo "💡 提示: "
echo " - 实时日志: tail -f $DEV_ROOT/logs/guardian.log"
echo " - 停止并清理: ./dev.sh stop"