Repository navigation
Expand file tree
/
Copy pathmanage.sh
More file actions
executable file
·318 lines (283 loc) · 7.63 KB
/
Copy pathmanage.sh
File metadata and controls
executable file
·318 lines (283 loc) · 7.63 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
#!/bin/bash
# Nginx Proxy HTTPS 统一管理脚本
# 使用方法: ./manage.sh [命令] [参数]
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 打印函数
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 显示帮助
show_help() {
echo "Nginx Proxy HTTPS 统一管理脚本"
echo ""
echo "使用方法: ./manage.sh [命令]"
echo ""
echo "命令:"
echo " start - 启动所有服务"
echo " stop - 停止所有服务"
echo " restart - 重启所有服务"
echo " status - 查看服务状态"
echo " logs [service] - 查看服务日志"
echo " monitor - 完整监控报告"
echo " dns-check - DNS配置检查"
echo " add-service - 添加新服务"
echo " setup - 初始配置"
echo " backup - 备份配置"
echo " help - 显示帮助"
echo ""
echo "示例:"
echo " ./manage.sh start"
echo " ./manage.sh logs nginx-proxy"
echo " ./manage.sh monitor"
}
# 检查依赖
check_deps() {
if ! docker info >/dev/null 2>&1; then
error "Docker未运行"
exit 1
fi
if [ ! -f "docker-compose.yml" ]; then
error "docker-compose.yml 不存在"
exit 1
fi
}
# 启动服务
start() {
info "启动服务..."
docker compose up -d
success "服务已启动"
status
}
# 停止服务
stop() {
info "停止服务..."
docker compose down
success "服务已停止"
}
# 重启服务
restart() {
info "重启服务..."
docker compose restart
success "服务已重启"
status
}
# 查看状态
status() {
info "服务状态:"
docker compose ps
echo ""
# 显示域名信息
info "域名访问:"
grep -A 5 'environment:' docker-compose.yml | grep 'VIRTUAL_HOST' | awk -F '=' '{print $2}' | sed 's/\"//g' | while read domain; do
if [ -n "$domain" ]; then
echo " https://$domain"
fi
done
echo ""
}
# 查看日志
logs() {
local service=$1
if [ -z "$service" ]; then
info "查看所有服务日志..."
docker compose logs -f
else
info "查看 $service 日志..."
docker compose logs -f "$service"
fi
}
# 监控报告
monitor() {
echo "🔍 监控报告"
echo "============"
echo ""
# 服务状态
info "服务状态:"
docker compose ps
echo ""
# 证书状态
info "证书状态:"
if [ -d "certs" ]; then
for cert_dir in certs/*/; do
if [ -d "$cert_dir" ]; then
domain=$(basename "$cert_dir")
cert_file="$cert_dir/cert.pem"
if [ -f "$cert_file" ]; then
expiry=$(openssl x509 -in "$cert_file" -text -noout | grep -A 2 "Validity" | tail -1 | sed 's/.*Not After : //')
echo " $domain: ✅ 正常 (到期: $expiry)"
else
echo " $domain: ❌ 证书不存在"
fi
fi
done
else
echo " ❌ 证书目录不存在"
fi
echo ""
# 网络测试
info "网络测试:"
grep -A 5 'environment:' docker-compose.yml | grep 'VIRTUAL_HOST' | awk -F '=' '{print $2}' | sed 's/\"//g' | while read domain; do
if [ -n "$domain" ]; then
if curl -s -I "https://$domain" > /dev/null 2>&1; then
echo " $domain: ✅ HTTPS正常"
else
echo " $domain: ❌ HTTPS失败"
fi
fi
done
echo ""
# 资源使用
info "资源使用:"
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
echo ""
}
# DNS检查
dns_check() {
info "DNS配置检查..."
# 获取服务器IP
server_ip=$(curl -s --max-time 5 ifconfig.me 2>/dev/null || echo "unknown")
info "服务器IP: $server_ip"
echo ""
# 检查域名
grep -A 5 'environment:' docker-compose.yml | grep 'VIRTUAL_HOST' | awk -F '=' '{print $2}' | sed 's/\"//g' | while read domain; do
if [ -n "$domain" ]; then
info "检查域名: $domain"
# 解析检查
resolved_ip=$(nslookup "$domain" 2>/dev/null | grep -A1 "Name:" | tail -1 | awk '{print $2}')
if [ -n "$resolved_ip" ]; then
if [ "$resolved_ip" = "$server_ip" ]; then
echo " ✅ 解析正确: $resolved_ip"
else
echo " ⚠️ 解析到: $resolved_ip (期望: $server_ip)"
fi
else
echo " ❌ 解析失败"
fi
# HTTPS检查
if curl -s -I "https://$domain" > /dev/null 2>&1; then
echo " ✅ HTTPS正常"
else
echo " ❌ HTTPS失败"
fi
echo ""
fi
done
}
# 添加服务
add_service() {
info "添加新服务..."
echo ""
read -p "服务名称: " service_name
read -p "容器名称: " container_name
read -p "镜像名称: " image_name
read -p "端口号: " port
read -p "域名: " domain
cat >> docker-compose.yml << EOF
# $service_name
$service_name:
container_name: $container_name
restart: always
image: $image_name
expose:
- "$port"
environment:
- VIRTUAL_HOST=$domain
- VIRTUAL_PORT=$port
- LETSENCRYPT_HOST=$domain
- LETSENCRYPT_EMAIL=\${LETSENCRYPT_EMAIL}
EOF
success "服务已添加"
info "运行 './manage.sh start' 启动新服务"
}
# 初始配置
setup() {
info "初始配置..."
# 检查.env
if [ ! -f .env ]; then
if [ -f setup-env.sh ]; then
./setup-env.sh
else
error ".env 文件不存在,请手动创建"
exit 1
fi
fi
# 检查docker-compose.yml
if [ ! -f docker-compose.yml ]; then
if [ -f docker-compose.example.yml ]; then
cp docker-compose.example.yml docker-compose.yml
info "已复制 docker-compose.example.yml"
else
error "docker-compose.yml 不存在"
exit 1
fi
fi
success "配置完成"
info "运行 './manage.sh start' 启动服务"
}
# 备份配置
backup() {
local backup_dir="backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$backup_dir"
cp docker-compose.yml "$backup_dir/" 2>/dev/null || true
cp .env "$backup_dir/" 2>/dev/null || true
cp -r certs "$backup_dir/" 2>/dev/null || true
success "配置已备份到 $backup_dir"
}
# 主函数
main() {
case "$1" in
start)
check_deps
start
;;
stop)
check_deps
stop
;;
restart)
check_deps
restart
;;
status)
check_deps
status
;;
logs)
check_deps
logs "$2"
;;
monitor)
check_deps
monitor
;;
dns-check)
dns_check
;;
add-service)
add_service
;;
setup)
setup
;;
backup)
backup
;;
help|--help|-h|"")
show_help
;;
*)
error "未知命令: $1"
echo ""
show_help
exit 1
;;
esac
}
main "$@"