-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopeni.sh
328 lines (286 loc) · 9.64 KB
/
openi.sh
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
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
#!/bin/bash
# =====================================================
# 环境要求说明:
# 1. 操作系统:Linux Ubuntu
# 2. 权限要求:需要 root 权限
# 3. 测试环境:openi 启智免费算力平台
# 4. 使用方法:
# 方法1:下载后直接运行:
# ./openi.sh <应用名称> [edit|run]
# 方法2:使用curl方式运行:
# deactivate && apt-get update && apt-get install -y curl; bash -c "$(curl -fsSL https://gitee.com/fuliai/ai2u/raw/main/openi.sh)" - <应用名称> [edit|run]
#
# 参数说明:
# - 应用名称:必填,须与apps目录下的安装文件名一致
# - 运行模式:可选,edit或run,默认为run
# - cli模式:可选,cli,默认为非cli模式 ./openi.sh cli <应用名称>
# cd /tmp/code && deactivate && apt-get update && apt-get install -y curl; bash -c "$(curl -fsSL https://gitee.com/fuliai/ai2u/raw/main/openi.sh)" - cli comfyui-ics
# =====================================================
# 获取最后一个参数作为应用名称
APP_NAME="${@: -2:1}"
RUN_MODE="${@: -1}"
# 如果最后一个参数不是 edit 或 run,则假定它是应用名称
if [[ "$RUN_MODE" != "edit" && "$RUN_MODE" != "run" ]]; then
APP_NAME="${@: -1}"
RUN_MODE="run"
fi
# 检查是否提供了应用名称
if [ -z "$APP_NAME" ]; then
echo "错误:请提供应用名称(须与apps目录下的安装文件名一致)"
echo "使用方法:./ai2u.sh <应用名称> [edit|run]"
exit 1
fi
# 设置错误时退出
set -e
# 设置工作目录
WORK_DIR=$(pwd)
# 确保日志目录存在
mkdir -p $WORK_DIR/logs
# 日志函数
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a $WORK_DIR/logs/preinstall.log
}
# 初始化日志文件
log "=== 开始新的安装会话 ==="
log "初始化工作目录: $WORK_DIR"
# 检查系统要求
check_requirements() {
log "检查系统要求..."
# 检查 Python 版本
if ! command -v python &> /dev/null; then
log "错误: 未安装 Python"
exit 1
fi
# 检查 pip 版本并升级
log "升级 pip..."
python -m pip install --upgrade pip --trusted-host mirrors.cloud.tencent.com -i https://mirrors.cloud.tencent.com/pypi/simple
# 检查必要命令
for cmd in wget curl git unzip aria2; do
if ! command -v $cmd &> /dev/null; then
log "安装必要工具: $cmd"
apt update && apt install -y $cmd
fi
done
}
# 创建虚拟环境
setup_venv() {
log "检查虚拟环境..."
# 检查是否存在可用的虚拟环境
if [ -d ".venv" ] && [ -f ".venv/bin/activate" ]; then
log "发现已存在的虚拟环境,尝试激活..."
source .venv/bin/activate
# 验证虚拟环境是否可用
if python -c "import sys; sys.exit(0 if sys.prefix.endswith('.venv') else 1)" 2>/dev/null; then
log "已有虚拟环境可用,跳过创建步骤"
return 0
else
log "已存在的虚拟环境不可用,需要重建..."
rm -rf .venv
fi
fi
log "创建新的虚拟环境..."
# 尝试安装uv,如果失败则使用venv
if pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple; then
log "使用uv创建虚拟环境..."
export UV_PYTHON_BUILD_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/python-build-standalone/
if ! uv venv -p 3.10; then
log "uv创建虚拟环境失败,使用python venv..."
python -m venv .venv
fi
else
log "uv安装失败,使用python venv..."
python -m venv .venv
fi
source .venv/bin/activate
}
# 安装依赖
install_dependencies() {
log "检查并安装依赖..."
# 添加重试逻辑
MAX_RETRIES=3
RETRY_COUNT=0
# 检查marimo是否已安装且可用
if python -c "import marimo" 2>/dev/null; then
log "marimo已安装,跳过安装步骤"
return 0
fi
log "开始安装marimo..."
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
if uv pip install -U marimo -i https://pypi.tuna.tsinghua.edu.cn/simple; then
log "依赖安装成功"
return 0
else
RETRY_COUNT=$((RETRY_COUNT + 1))
log "安装失败,尝试重试 ($RETRY_COUNT/$MAX_RETRIES)..."
sleep 5
fi
done
log "使用pip作为备选方案..."
if pip install -U marimo -i https://pypi.tuna.tsinghua.edu.cn/simple; then
log "使用pip安装成功"
return 0
else
log "错误: 依赖安装失败"
exit 1
fi
}
# 设置项目文件
setup_project() {
log "设置项目文件..."
# 如果目录已存在,先删除,再clone https://gitee.com/fuliai/ai2u.git
if [ -d "ai2u" ]; then
log "删除已存在的项目目录..."
rm -rf ai2u
fi
log "克隆项目..."
git clone https://gitee.com/fuliai/ai2u.git
cd ai2u
# 解压 frp.zip
if [ -f frp.zip ]; then
log "解压 frp.zip..."
unzip -o frp.zip -d $WORK_DIR/apps/
else
log "错误: frp.zip 不存在"
exit 1
fi
# 解压 ksa.zip
if [ -f ksa.zip ]; then
log "解压 ksa.zip..."
unzip -o ksa.zip -d $WORK_DIR/apps/
else
log "错误: ksa.zip 不存在"
exit 1
fi
}
# 启动服务
start_services() {
log "启动服务..."
# 临时禁用错误退出
set +e
log "正在启动 KSA..."
if [ ! -x "$WORK_DIR/apps/ksa/ksa_x64" ]; then
log "错误: KSA 可执行文件不存在或没有执行权限"
chmod +x "$WORK_DIR/apps/ksa/ksa_x64" 2>/dev/null || {
log "错误: 无法设置执行权限"
return 1
}
fi
rm -f "$WORK_DIR/ksa_ID_Token.txt" # 先删除可能存在的旧文件
# 运行 KSA 并捕获返回值
"$WORK_DIR/apps/ksa/ksa_x64" > "$WORK_DIR/ksa_ID_Token.txt" 2>&1
KSA_STATUS=$?
if [ $KSA_STATUS -ne 0 ]; then
log "警告: KSA 返回状态码 $KSA_STATUS"
fi
# 检查文件是否生成并有内容
if [ -s "$WORK_DIR/ksa_ID_Token.txt" ]; then
log "KSA 已运行完成,ID和Token已保存到 $WORK_DIR/ksa_ID_Token.txt"
echo "==================================="
echo "KSA 已运行完成,ID和Token已保存到 $WORK_DIR/ksa_ID_Token.txt"
echo "详细使用请进群获取: https://qr61.cn/oohivs/qRp62U6"
echo "==================================="
echo ""
else
log "警告: KSA 未生成有效的 ID 和 Token,尝试再次运行"
"$WORK_DIR/apps/ksa/ksa_x64" > "$WORK_DIR/ksa_ID_Token.txt" 2>&1
if [ ! -s "$WORK_DIR/ksa_ID_Token.txt" ]; then
log "错误: KSA 再次运行失败"
log "请自行部署内网穿透工具来访问服务"
fi
fi
# 重新启用错误退出
set -e
# 启动 frp
log "检查配置文件,存在才启动frp"
if [ -f "$WORK_DIR/apps/frpc.ini" ]; then
log "配置文件存在,正在启动 FRP..."
chmod +x "$WORK_DIR/apps/frpc"
cd "$WORK_DIR/apps"
./frpc > "$WORK_DIR/logs/frp.log" 2>&1 &
FRP_PID=$!
echo $FRP_PID > frp.pid
log "FRP 服务已启动 (PID: $FRP_PID)"
# 显示访问信息
echo ""
echo "==================================="
echo "请使用以下地址打开安装界面:"
echo ""
echo "http://hb.frp.one:10086/"
echo ""
echo "安装日志位置: $WORK_DIR/logs/"
echo "==================================="
echo ""
else
log "错误: frpc.ini 不存在,请获取后重试,并放在 $WORK_DIR/apps/ 目录下"
log "获取方式: 加群 https://qr61.cn/oohivs/qRp62U6"
log "跳过启动frp"
fi
}
start_app() {
# 通过marimo来启动Ai程序
log "启动-AI应用-安装程序"
cd $WORK_DIR
# 启动的文件名称,使用APP_NAME变量
if [ "$RUN_MODE" = "run" ]; then
log "启动应用:$APP_NAME"
log "启动端口:7890"
log "如果不会内网穿透,请使用终端模式:退出安装程序运行以下命令"
log "python 'apps/${APP_NAME}.py'"
marimo run "apps/${APP_NAME}.py" -p 7890 --no-token
else
log "启动应用:$APP_NAME (模式: 编辑模式)"
echo ""
echo "==================================="
echo "请使用以下方式打开安装界面:"
echo ""
echo "ksa或frp,视频教程: https://qr61.cn/oohivs/qRp62U6"
echo ""
echo "安装日志位置: $WORK_DIR/logs/"
echo "==================================="
echo ""
marimo edit "apps/${APP_NAME}.py" -p 7890 --no-token
fi
}
start_app_cli() {
# 通过marimo来启动Ai程序
log "启动-AI应用-安装程序"
cd $WORK_DIR
log "启动文件: apps/${APP_NAME}.py"
# 检查文件是否存在
if [ ! -f "apps/${APP_NAME}.py" ]; then
log "错误: 文件不存在"
exit 1
fi
# 启动的文件名称,使用APP_NAME变量
python apps/${APP_NAME}.py
}
# 主函数
main() {
log "开始安装..."
log "工作目录: $WORK_DIR"
log "应用名称: $APP_NAME"
log "运行模式: $RUN_MODE"
check_requirements
setup_venv
install_dependencies
setup_project
start_services
start_app
}
main_cli() {
log "开始安装..."
log "工作目录: $WORK_DIR"
log "应用名称: $APP_NAME"
check_requirements
setup_venv
install_dependencies
setup_project
start_services
start_app_cli
}
# 根据命令行参数执行不同的主函数
if [ "$1" = "cli" ]; then
main_cli
else
main
fi