Repository navigation
Expand file tree
/
Copy pathfull_deploy.sh
More file actions
executable file
·458 lines (398 loc) · 14.4 KB
/
Copy pathfull_deploy.sh
File metadata and controls
executable file
·458 lines (398 loc) · 14.4 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
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
#!/bin/bash
# =============================================================================
# 多协议代理服务器完整部署脚本(SOCKS5 + HTTP/HTTPS)
# 适用于指纹浏览器等应用
# 作者: Assistant
# 版本: 2.0 - 支持 SOCKS5 / HTTP / HTTPS(CONNECT) 多协议代理
# =============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目信息
PROJECT_NAME="multi-proxy-server"
WORK_DIR="/opt/$PROJECT_NAME"
# 打印标题
print_title() {
echo -e "${BLUE}"
echo "=================================================================="
echo " 多协议代理服务器部署脚本 (SOCKS5/HTTP/HTTPS)"
echo " 适用于指纹浏览器等应用 (v2.0)"
echo "=================================================================="
echo -e "${NC}"
}
# 检查系统要求
check_requirements() {
echo -e "${YELLOW}检查系统要求...${NC}"
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}错误: 请使用root用户运行此脚本${NC}"
exit 1
fi
if ! command -v docker &> /dev/null; then
echo -e "${YELLOW}Docker未安装,正在安装...${NC}"
curl -fsSL https://get.docker.com | sh
systemctl enable docker
systemctl start docker
echo -e "${GREEN}✓ Docker安装完成${NC}"
fi
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
echo -e "${YELLOW}Docker Compose未安装,正在安装...${NC}"
apt-get update && apt-get install -y docker-compose-plugin || \
(curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose)
echo -e "${GREEN}✓ Docker Compose安装完成${NC}"
fi
if docker compose version &>/dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
echo -e "${YELLOW}清理旧的容器和镜像...${NC}"
docker stop multi-proxy-server socks5-proxy-server 2>/dev/null || true
docker rm multi-proxy-server socks5-proxy-server 2>/dev/null || true
docker rmi $(docker images | grep -E 'multi-proxy-server|socks5-proxy-server' | awk '{print $3}') 2>/dev/null || true
echo -e "${GREEN}✓ 系统要求检查完成${NC}"
}
# 用户配置
setup_config() {
echo -e "${YELLOW}配置代理参数...${NC}"
SOCKS_USER="proxy_$(openssl rand -hex 4)"
SOCKS_PASS="$(openssl rand -base64 16)"
SOCKS_PORT="1080"
HTTP_PORT="8118"
echo -e "${BLUE}是否使用默认配置?${NC}"
echo "默认用户名: $SOCKS_USER"
echo "默认密码: $SOCKS_PASS"
echo "默认SOCKS5端口: $SOCKS_PORT"
echo "默认HTTP/HTTPS端口: $HTTP_PORT"
echo ""
read -p "使用默认配置?(y/n) [y]: " use_default
if [[ $use_default == "n" || $use_default == "N" ]]; then
read -p "请输入代理用户名: " SOCKS_USER
read -s -p "请输入代理密码: " SOCKS_PASS
echo ""
read -p "请输入SOCKS5端口号 (默认1080): " custom_port
SOCKS_PORT=${custom_port:-1080}
read -p "请输入HTTP/HTTPS端口号 (默认8118): " custom_http_port
HTTP_PORT=${custom_http_port:-8118}
fi
for port_var in SOCKS_PORT HTTP_PORT; do
port_val="${!port_var}"
while ss -tuln 2>/dev/null | grep -q ":$port_val " || netstat -tuln 2>/dev/null | grep -q ":$port_val "; do
echo -e "${RED}错误: 端口 $port_val 已被占用${NC}"
read -p "请输入其他${port_var}端口号: " port_val
done
eval "$port_var=$port_val"
done
if [[ "$SOCKS_PORT" == "$HTTP_PORT" ]]; then
echo -e "${RED}错误: SOCKS5端口和HTTP端口不能相同${NC}"
exit 1
fi
echo -e "${GREEN}✓ 配置完成${NC}"
}
# 创建项目文件
create_project_files() {
echo -e "${YELLOW}创建项目文件...${NC}"
if docker compose version &>/dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
if [[ -d "$WORK_DIR" ]]; then
echo -e "${YELLOW}移除旧的项目目录...${NC}"
cd "$WORK_DIR"
$COMPOSE_CMD down 2>/dev/null || true
cd /
rm -rf "$WORK_DIR"
fi
mkdir -p "$WORK_DIR"
cd "$WORK_DIR"
# 创建3proxy配置文件
cat > 3proxy.cfg << EOF
# DNS 建议保留,必要时你可换成自己可信的 DoH/企业 DNS
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536
# 放宽时间参数:accept=30s, connect=120s, io=3600s(1h), dns=60s, tcpfin=600s, keepalive=86400s(1d), dnsretry=15s, session=86400s(1d)
# timeouts <accept> <connect> <io> <dnsresolv> <tcpfin> <keepalive> <dnsretry> <session>
timeouts 30 120 3600 60 600 86400 15 86400
log /dev/stdout
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
auth strong
users $SOCKS_USER:CL:$SOCKS_PASS
allow $SOCKS_USER
# 同时开启 SOCKS5 和 HTTP CONNECT 两个入口
# 1) SOCKS5(原有)
socks -p$SOCKS_PORT
# 2) HTTP/HTTPS 代理(支持 CONNECT 方法实现 HTTPS 隧道)
proxy -p$HTTP_PORT -n
EOF
# 创建Dockerfile
cat > Dockerfile << 'EOF'
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
RUN apt-get update && \
apt-get install -y \
build-essential \
wget \
ca-certificates \
tzdata \
net-tools \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /tmp
RUN wget -q https://github.com/3proxy/3proxy/archive/0.9.4.tar.gz && \
tar -xzf 0.9.4.tar.gz && \
cd 3proxy-0.9.4 && \
make -f Makefile.Linux && \
cp bin/3proxy /usr/local/bin/ && \
chmod +x /usr/local/bin/3proxy && \
cd / && rm -rf /tmp/*
RUN mkdir -p /etc/3proxy && \
(id -u proxy &>/dev/null || useradd -r -s /bin/false proxy)
COPY 3proxy.cfg /etc/3proxy/3proxy.cfg
RUN chown proxy:proxy /etc/3proxy/3proxy.cfg
ARG SOCKS_PORT=1080
ARG HTTP_PORT=8118
EXPOSE $SOCKS_PORT $HTTP_PORT
USER proxy
WORKDIR /etc/3proxy
CMD ["/usr/local/bin/3proxy", "/etc/3proxy/3proxy.cfg"]
EOF
# 创建docker-compose.yml
cat > docker-compose.yml << EOF
services:
multi-proxy:
build:
context: .
args:
SOCKS_PORT: $SOCKS_PORT
HTTP_PORT: $HTTP_PORT
container_name: multi-proxy-server
ports:
- "$SOCKS_PORT:$SOCKS_PORT"
- "$HTTP_PORT:$HTTP_PORT"
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD-SHELL", "netstat -tuln | grep -q ':$SOCKS_PORT ' && netstat -tuln | grep -q ':$HTTP_PORT '"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
EOF
# 创建管理脚本(先注入需要展开的变量,再追加其余内容)
cat > manage.sh << EOF
#!/bin/bash
cd "$WORK_DIR"
EOF
cat >> manage.sh << 'EOF'
if docker compose version &>/dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
case "$1" in
start)
echo -e "${GREEN}启动代理服务器...${NC}"
$COMPOSE_CMD up -d;;
stop)
echo -e "${YELLOW}停止代理服务器...${NC}"
$COMPOSE_CMD down;;
restart)
echo -e "${YELLOW}重启代理服务器...${NC}"
$COMPOSE_CMD restart;;
status)
echo -e "${GREEN}服务状态:${NC}"
$COMPOSE_CMD ps
echo -e "\n${GREEN}健康检查:${NC}"
health_status=$(docker inspect multi-proxy-server --format='{{.State.Health.Status}}' 2>/dev/null)
echo "${health_status:-未知}";;
logs)
echo -e "${GREEN}查看日志:${NC}"
$COMPOSE_CMD logs -f --tail=50;;
rebuild)
echo -e "${YELLOW}重新构建并启动...${NC}"
$COMPOSE_CMD down
$COMPOSE_CMD build --no-cache
$COMPOSE_CMD up -d;;
info)
echo -e "${GREEN}连接信息:${NC}"
cat connection_info.txt 2>/dev/null || echo "配置文件不存在";;
*)
echo "使用方法: $0 {start|stop|restart|status|logs|rebuild|info}"
exit 1;;
esac
EOF
chmod +x manage.sh
echo -e "${GREEN}✓ 项目文件创建完成${NC}"
}
# 部署服务
deploy_service() {
echo -e "${YELLOW}部署多协议代理服务器...${NC}"
if docker compose version &>/dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
echo -e "${YELLOW}构建Docker镜像...${NC}"
$COMPOSE_CMD build --no-cache
if [[ $? -ne 0 ]]; then
echo -e "${RED}✗ Docker镜像构建失败${NC}"
exit 1
fi
echo -e "${YELLOW}启动服务...${NC}"
$COMPOSE_CMD up -d
if ! $COMPOSE_CMD ps | grep -q "Up"; then
echo -e "${RED}✗ 服务启动失败${NC}"
echo "请查看日志获取详细信息:"
$COMPOSE_CMD logs
exit 1
fi
echo -e "${YELLOW}等待健康检查通过...${NC}"
for i in {1..20}; do
health_status=$(docker inspect multi-proxy-server --format='{{.State.Health.Status}}' 2>/dev/null)
if [[ "$health_status" == "healthy" ]]; then
echo -e "\n${GREEN}✓ 服务健康检查通过${NC}"
return 0
elif [[ "$health_status" == "unhealthy" ]]; then
echo -e "\n${RED}✗ 服务健康检查失败${NC}"
echo "请查看日志获取详细信息:"
$COMPOSE_CMD logs --tail=50
exit 1
fi
echo -n "."
sleep 2
done
echo -e "\n${YELLOW}⚠ 健康检查超时。服务可能仍在启动或存在问题。${NC}"
echo "请使用 ./manage.sh logs 查看日志。"
exit 1
}
# 其他函数 (setup_firewall, generate_connection_info, show_completion) ...
setup_firewall() {
echo -e "${YELLOW}配置防火墙...${NC}"
if command -v ufw &> /dev/null && ufw status | grep -q "Status: active"; then
ufw allow $SOCKS_PORT/tcp >/dev/null 2>&1
ufw allow $HTTP_PORT/tcp >/dev/null 2>&1
echo -e "${GREEN}✓ UFW防火墙已允许端口 $SOCKS_PORT (SOCKS5) 和 $HTTP_PORT (HTTP/HTTPS)${NC}"
fi
if command -v firewall-cmd &> /dev/null && systemctl is-active --quiet firewalld; then
firewall-cmd --permanent --add-port=$SOCKS_PORT/tcp >/dev/null 2>&1
firewall-cmd --permanent --add-port=$HTTP_PORT/tcp >/dev/null 2>&1
firewall-cmd --reload >/dev/null 2>&1
echo -e "${GREEN}✓ firewalld防火墙已允许端口 $SOCKS_PORT (SOCKS5) 和 $HTTP_PORT (HTTP/HTTPS)${NC}"
fi
}
generate_connection_info() {
echo -e "${YELLOW}生成连接信息...${NC}"
SERVER_IP=$(curl -s4 ifconfig.me 2>/dev/null || curl -s4 ipinfo.io/ip 2>/dev/null || hostname -I | awk '{print $1}')
cat > connection_info.txt << EOF
================================================================
多协议代理服务器连接信息
================================================================
🌐 服务器信息:
IP地址: $SERVER_IP
用户名: $SOCKS_USER
密码: $SOCKS_PASS
📡 SOCKS5 代理:
端口: $SOCKS_PORT
协议: SOCKS5
地址: socks5://$SOCKS_USER:$SOCKS_PASS@$SERVER_IP:$SOCKS_PORT
🌍 HTTP/HTTPS 代理:
端口: $HTTP_PORT
协议: HTTP (支持 CONNECT 隧道,可代理 HTTPS)
地址: http://$SOCKS_USER:$SOCKS_PASS@$SERVER_IP:$HTTP_PORT
📱 指纹浏览器配置 (SOCKS5):
代理类型: Socks5
代理主机: $SERVER_IP
代理端口: $SOCKS_PORT
代理账号: $SOCKS_USER
代理密码: $SOCKS_PASS
📱 指纹浏览器配置 (HTTP/HTTPS):
代理类型: HTTP
代理主机: $SERVER_IP
代理端口: $HTTP_PORT
代理账号: $SOCKS_USER
代理密码: $SOCKS_PASS
🔧 管理命令 (全局可用,任意目录执行):
pxy start # 启动服务
pxy stop # 停止服务
pxy restart # 重启服务
pxy status # 查看状态
pxy logs # 查看日志
pxy info # 查看连接信息
pxy rebuild # 强制重新构建并启动
🧪 连接测试 (在服务器上执行):
# SOCKS5 测试
curl --socks5-hostname $SOCKS_USER:$SOCKS_PASS@127.0.0.1:$SOCKS_PORT https://ifconfig.me
# HTTP 代理测试
curl -x http://$SOCKS_USER:$SOCKS_PASS@127.0.0.1:$HTTP_PORT http://ifconfig.me
# HTTPS 代理测试 (通过 HTTP CONNECT 隧道)
curl -x http://$SOCKS_USER:$SOCKS_PASS@127.0.0.1:$HTTP_PORT https://ifconfig.me
================================================================
部署时间: $(date '+%Y-%m-%d %H:%M:%S')
================================================================
EOF
echo -e "${GREEN}✓ 连接信息已保存到: $WORK_DIR/connection_info.txt${NC}"
}
show_completion() {
SERVER_IP=$(curl -s4 ifconfig.me 2>/dev/null || curl -s4 ipinfo.io/ip 2>/dev/null || hostname -I | awk '{print $1}')
echo -e "${GREEN}"
echo "=================================================================="
echo " 🎉 部署完成!"
echo "=================================================================="
echo -e "${NC}"
echo -e "${BLUE}📋 连接信息:${NC}"
echo "服务器地址: $SERVER_IP"
echo "用户名: $SOCKS_USER"
echo "密码: $SOCKS_PASS"
echo ""
echo -e "${BLUE}📡 SOCKS5 代理:${NC}"
echo "端口: $SOCKS_PORT"
echo "地址: socks5://$SOCKS_USER:$SOCKS_PASS@$SERVER_IP:$SOCKS_PORT"
echo ""
echo -e "${BLUE}🌍 HTTP/HTTPS 代理:${NC}"
echo "端口: $HTTP_PORT"
echo "地址: http://$SOCKS_USER:$SOCKS_PASS@$SERVER_IP:$HTTP_PORT"
echo "(HTTPS 通过 HTTP CONNECT 隧道自动支持)"
echo ""
echo -e "${BLUE}🔧 管理命令 (全局可用):${NC}"
echo "pxy status # 查看状态"
echo "pxy logs # 查看日志"
echo ""
echo -e "${YELLOW}⚠️ 重要提醒:${NC}"
echo "1. 请妥善保存您的用户名和密码。"
echo "2. 完整的连接信息已保存到: ${GREEN}$WORK_DIR/connection_info.txt${NC}"
echo "3. 服务已设置为开机自动启动。"
echo ""
}
# 注册全局管理命令
register_global_command() {
echo -e "${YELLOW}注册全局管理命令...${NC}"
ln -sf "$WORK_DIR/manage.sh" /usr/local/bin/pxy
echo -e "${GREEN}✓ 已注册全局命令: pxy (可在任意目录使用)${NC}"
}
# 主函数
main() {
print_title
check_requirements
setup_config
create_project_files
deploy_service
setup_firewall
register_global_command
generate_connection_info
show_completion
}
main