-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
413 lines (351 loc) · 11.9 KB
/
Copy pathdeploy.sh
File metadata and controls
413 lines (351 loc) · 11.9 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
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
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
#!/bin/bash
#=========================================================
# Termux + Ubuntu容器 + Docker + 宝塔面板 终极部署脚本
# 适用系统:Android 9-14 (Termux/F-Droid版本)
# 作者:Chris
# 功能:全自动部署,无需手动操作,异常自动修复
#=========================================================
# 定义颜色输出
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
NC='\033[0m'
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
# 带重试的命令执行函数
retry_command() {
local cmd="$1"
local desc="$2"
local max_retry=3
local attempt=0
while [ $attempt -lt $max_retry ]; do
log_info "执行:${desc} (尝试 $((attempt + 1))/${max_retry})"
if eval "$cmd" 2>&1; then
log_success "${desc} 执行成功"
return 0
else
attempt=$((attempt + 1))
log_warn "${desc} 执行失败,5秒后重试..."
sleep 5
fi
done
log_error "${desc} 重试${max_retry}次均失败"
return 1
}
# 修复函数
fix_issue() {
local issue_type="$1"
case "$issue_type" in
"termux_update")
log_warn "执行修复:切换Termux清华源并重新更新"
sed -i 's|deb.*stable main$|deb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable main|' "$PREFIX/etc/apt/sources.list" 2>/dev/null || true
pkg update -y && pkg upgrade -y
;;
"ubuntu_install")
log_warn "执行修复:清理残留容器后重新安装"
proot-distro remove ubuntu -y 2>/dev/null || true
proot-distro install ubuntu
;;
*)
log_error "未知的修复类型:${issue_type}"
return 1
;;
esac
}
#=========================================================
# 主程序开始
#=========================================================
log_info "========================================"
log_info " Termux 宝塔+Docker 一键部署脚本"
log_info "========================================"
# 环境检测
log_info "检测Termux环境..."
if [ ! -d "/data/data/com.termux/files/usr" ] || [ -z "$TERMUX_VERSION" ]; then
log_error "检测失败:此脚本仅支持在Termux终端中运行!"
log_info "请访问 https://f-droid.org/packages/com.termux/ 下载官方Termux"
exit 1
fi
log_success "Termux环境检测通过"
# 检查必要命令
check_command() {
local cmd="$1"
if ! command -v "$cmd" &> /dev/null; then
log_warn "缺少命令:${cmd},自动安装中..."
yes | pkg install "$cmd" -y
if [ $? -ne 0 ]; then
log_error "安装 ${cmd} 失败,请手动检查网络"
exit 1
fi
fi
}
log_info "检查核心依赖..."
check_command "proot-distro"
check_command "wget"
check_command "curl"
log_success "核心依赖检查完成"
# 设置非交互模式
export DEBIAN_FRONTEND=noninteractive
# Step 1: 更新Termux并更换清华源
log_info "Step 1/7:更新Termux系统环境..."
retry_command "yes | pkg update -y && yes | pkg upgrade -y" "更新Termux环境"
log_info "更换Termux为清华源..."
if [ -f "$PREFIX/etc/apt/sources.list" ]; then
sed -i 's|deb.*termux.net|deb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main|' "$PREFIX/etc/apt/sources.list"
sed -i 's|deb.*bagsha.com|deb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main|' "$PREFIX/etc/apt/sources.list"
fi
log_success "Termux源更换完成"
# 安装基础软件包
log_info "安装基础软件包..."
yes | pkg install proot-distro wget curl git nano -y > /dev/null 2>&1
log_success "基础软件包安装完成"
# Step 2: 安装Ubuntu容器
log_info "Step 2/7:安装Ubuntu容器..."
if [ ! -d "/data/data/com.termux/files/home/proot-distro/ubuntu" ]; then
if ! retry_command "proot-distro install ubuntu 2>&1 | tee /dev/stderr" "安装Ubuntu容器"; then
fix_issue "ubuntu_install"
fi
else
log_info "Ubuntu容器已存在,跳过安装"
fi
log_success "Ubuntu容器准备完成"
# Step 3: 配置Ubuntu容器环境
log_info "Step 3/7:配置Ubuntu容器环境..."
# 构建容器内部署脚本
cat > /tmp/ubuntu_setup.sh << 'UBUNTU_SCRIPT'
#!/bin/bash
# Ubuntu容器内部配置脚本
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
export DEBIAN_FRONTEND=noninteractive
# 容器内重试函数
container_retry() {
local cmd="$1"
local desc="$2"
local max_retry=3
local attempt=0
while [ $attempt -lt $max_retry ]; do
log_info "容器内:${desc} (尝试 $((attempt + 1))/${max_retry})"
if eval "$cmd" 2>&1; then
log_success "容器内:${desc} 成功"
return 0
else
attempt=$((attempt + 1))
log_warn "容器内:${desc} 失败,5秒后重试..."
sleep 5
fi
done
log_error "容器内:${desc} 重试失败"
return 1
}
log_info "========================================"
log_info " Ubuntu容器环境配置"
log_info "========================================"
# 更换阿里云源
log_info "更换Ubuntu软件源为阿里云..."
sed -i 's|archieve.ubuntu.com|mirrors.aliyun.com|g' /etc/apt/sources.list
sed -i 's|security.ubuntu.com|mirrors.aliyun.com|g' /etc/apt/sources.list
log_success "软件源更换完成"
# 更新系统
log_info "更新系统软件包..."
container_retry "apt update -y && apt upgrade -y" "更新系统"
log_success "系统更新完成"
# 安装Docker依赖
log_info "安装Docker所需依赖..."
container_retry "apt install -y iptables iproute2 bridge-utils curl wget python3" "安装Docker依赖"
log_success "Docker依赖安装完成"
# 配置内核参数(适配Proot环境)
log_info "配置内核参数..."
cat >> /etc/sysctl.conf << EOF
kernel.unprivileged_userns_clone=1
net.ipv4.ip_forward=1
EOF
sysctl -p > /dev/null 2>&1 || true
log_success "内核参数配置完成"
# 配置账户
log_info "配置账户信息..."
echo "root:123" | chpasswd
log_success "Root账户密码设置为:123"
# 创建普通用户
if ! id "admin" &>/dev/null; then
useradd -m -s /bin/bash admin
echo "admin:123456" | chpasswd
usermod -aG sudo,docker admin
log_success "创建admin用户,密码:123456"
fi
log_success "账户配置完成"
# 安装Docker
log_info "安装Docker服务..."
container_retry "apt install -y docker.io" "安装Docker"
log_success "Docker安装完成"
# 停止并禁用systemd服务(Proot环境不支持)
systemctl stop docker 2>/dev/null || true
systemctl disable docker 2>/dev/null || true
# 配置Docker
log_info "配置Docker守护进程..."
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << 'EOF'
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
log_success "Docker配置完成"
# Docker启动函数(Proot兼容版)
start_dockerd() {
log_info "启动Docker守护进程..."
# 清理可能残留的进程
killall -9 dockerd 2>/dev/null || true
sleep 2
# 启动dockerd(不使用iptables和ip-masq,规避Proot网络限制)
dockerd --iptables=false --ip-masq=false > /var/log/docker.log 2>&1 &
# 等待启动
local wait_count=0
while [ $wait_count -lt 20 ]; do
if docker info > /dev/null 2>&1; then
log_success "Docker守护进程启动成功"
chmod 666 /var/run/docker.sock 2>/dev/null || true
return 0
fi
sleep 1
wait_count=$((wait_count + 1))
done
log_error "Docker守护进程启动失败,查看日志:cat /var/log/docker.log"
return 1
}
# 首次启动Docker
start_dockerd
if [ $? -ne 0 ]; then
log_warn "首次启动失败,尝试重新启动..."
sleep 5
start_dockerd
fi
# 创建进程守护脚本
log_info "创建进程守护脚本..."
cat > /usr/local/bin/service-monitor.sh << 'MONITOR'
#!/bin/bash
# 服务监控脚本(自动重启异常服务)
LOG_FILE="/var/log/service-monitor.log"
DOCKER_RUNNING=false
BT_RUNNING=false
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
check_docker() {
if ! docker info > /dev/null 2>&1; then
log "Docker服务异常,自动重启..."
dockerd --iptables=false --ip-masq=false > /var/log/docker.log 2>&1 &
sleep 10
fi
}
check_bt() {
if ! command -v bt &>/dev/null; then
return 0
fi
if ! bt default > /dev/null 2>&1; then
log "宝塔服务异常,自动重启..."
bt restart > /dev/null 2>&1 || true
fi
}
while true; do
check_docker
check_bt
sleep 30
done
MONITOR
chmod +x /usr/local/bin/service-monitor.sh
# 启动守护脚本
log_info "启动服务守护进程..."
nohup /usr/local/bin/service-monitor.sh > /dev/null 2>&1 &
log_success "服务守护进程已启动"
# 安装宝塔面板
log_info "========================================"
log_info " 安装宝塔面板"
log_info "========================================"
# 下载宝塔安装脚本
if [ ! -f "/tmp/bt_install.sh" ]; then
log_info "下载宝塔安装脚本..."
wget -O /tmp/bt_install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh -q
chmod +x /tmp/bt_install.sh
fi
# 预处理安装脚本(禁用会导致问题的选项)
log_info "预处理安装脚本..."
sed -i 's/quick_install=1/quick_install=0/' /tmp/bt_install.sh
sed -i 's/compiler_install=0/compiler_install=1/' /tmp/bt_install.sh
log_success "安装脚本预处理完成"
# 执行安装
log_info "开始安装宝塔面板(这可能需要几分钟时间)..."
echo "y
" | bash /tmp/bt_install.sh 2>&1 | while read line; do
echo -e "\033[34m[宝塔]\033[0m $line"
done
# 安装完成后验证
sleep 10
log_info "验证安装状态..."
# 获取IP地址
SERVER_IP=$(hostname -I | awk '{print $1}')
# 检查宝塔状态
if command -v bt &>/dev/null; then
log_success "宝塔面板安装完成!"
echo ""
echo "========================================"
echo -e " ${GREEN}宝塔面板安装成功!${NC}"
echo "========================================"
echo -e " 访问地址:${YELLOW}http://${SERVER_IP}:8888${NC}"
echo -e " 用户名:${YELLOW}root${NC}"
echo -e " 密码:${YELLOW}123${NC}"
echo ""
echo -e " ${GREEN}Docker服务:${NC}已安装并配置自动守护"
echo -e " ${GREEN}服务监控:${NC}每30秒检查一次,异常自动重启"
echo "========================================"
echo ""
log_info "如需进入Ubuntu容器,请执行:proot-distro login ubuntu"
log_info "查看Docker状态:proot-distro login ubuntu -c 'docker ps'"
log_info "查看宝塔状态:proot-distro login ubuntu -c 'bt default'"
else
log_error "宝塔面板安装可能失败,请手动检查"
fi
# 清理
log_info "清理安装文件..."
rm -f /tmp/bt_install.sh
apt autoremove -y > /dev/null 2>&1
apt clean > /dev/null 2>&1
log_success "清理完成"
UBUNTU_SCRIPT
# 复制脚本到容器并执行
proot-distro login ubuntu --shared-tmp /tmp:/tmp << 'EXEC_SCRIPT'
bash /tmp/ubuntu_setup.sh
EXEC_SCRIPT
# 清理临时脚本
rm -f /tmp/ubuntu_setup.sh
log_success "========================================"
log_success " 全部部署完成!"
log_success "========================================"
echo ""
echo "进入Ubuntu容器:proot-distro login ubuntu"
echo "查看Docker状态:proot-distro login ubuntu -c 'docker ps'"
echo "查看宝塔信息:proot-distro login ubuntu -c 'bt default'"
echo ""
echo "如有任何问题,请查看容器内日志:"
echo " Docker日志:cat /var/log/docker.log"
echo " 监控日志:cat /var/log/service-monitor.log"