diff --git a/nginx b/nginx index f12a767..20a821e 100644 --- a/nginx +++ b/nginx @@ -1,6 +1,6 @@ #!/bin/bash -# 设置变量,提高可维护性 +# 设置变量 DATA_DIR="/data" SCRIPT_DIR="/boot/脚本" COMPOSE_FILE="$SCRIPT_DIR/ru.yaml" @@ -11,25 +11,36 @@ if [ "$EUID" -ne 0 ]; then exit 1 fi -# 创建目录 -echo "创建必要的目录..." -mkdir -p "$DATA_DIR" -mkdir -p "$SCRIPT_DIR" +# 函数:检查端口是否被占用 +check_port() { + local port=$1 + if netstat -tulpn 2>/dev/null | grep -q ":${port} "; then + return 1 # 端口被占用 + else + return 0 # 端口可用 + fi +} -# 检查目录是否创建成功 -if [ ! -d "$SCRIPT_DIR" ]; then - echo "错误:无法创建目录 $SCRIPT_DIR" - exit 1 -fi +# 函数:显示端口占用信息 +show_port_info() { + local port=$1 + echo "端口 $port 被以下进程占用:" + netstat -tulpn 2>/dev/null | grep ":${port} " || lsof -i :${port} 2>/dev/null + echo "----------------------------------------" +} -# 创建 Docker Compose 配置文件 -echo "创建 Docker Compose 配置文件..." -cat > "$COMPOSE_FILE" << 'EOF' +# 函数:生成 Docker Compose 配置 +generate_compose_config() { + local http_port=$1 + local admin_port=$2 + local https_port=$3 + + cat > "$COMPOSE_FILE" << EOF # Nginx Proxy Manager 配置 # 初始登录信息: # 邮箱: admin@example.com # 密码: changeme -# 管理界面: http://服务器IP:81 +# 管理界面: http://服务器IP:${admin_port} services: app: @@ -37,15 +48,136 @@ services: container_name: nginx-proxy-manager restart: unless-stopped ports: - - '80:80' # HTTP 流量 - - '81:81' # 管理界面 - - '443:443' # HTTPS 流量 + - '${http_port}:80' # HTTP 流量 + - '${admin_port}:81' # 管理界面 + - '${https_port}:443' # HTTPS 流量 volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt environment: - DISABLE_IPV6=false EOF +} + +# 创建目录 +echo "创建必要的目录..." +mkdir -p "$DATA_DIR" +mkdir -p "$SCRIPT_DIR" + +# 默认端口配置 +DEFAULT_HTTP_PORT="80" +DEFAULT_ADMIN_PORT="81" +DEFAULT_HTTPS_PORT="443" + +# 备用端口配置 +ALTERNATE_HTTP_PORT="8080" +ALTERNATE_ADMIN_PORT="8081" +ALTERNATE_HTTPS_PORT="8443" + +# 检查默认端口是否可用 +echo "检查端口占用情况..." + +http_port_used=0 +admin_port_used=0 +https_port_used=0 + +check_port $DEFAULT_HTTP_PORT || http_port_used=1 +check_port $DEFAULT_ADMIN_PORT || admin_port_used=1 +check_port $DEFAULT_HTTPS_PORT || https_port_used=1 + +# 如果有端口被占用,显示信息 +if [ $http_port_used -eq 1 ] || [ $admin_port_used -eq 1 ] || [ $https_port_used -eq 1 ]; then + echo "发现端口被占用:" + [ $http_port_used -eq 1 ] && echo " - 端口 $DEFAULT_HTTP_PORT (HTTP) 被占用" && show_port_info $DEFAULT_HTTP_PORT + [ $admin_port_used -eq 1 ] && echo " - 端口 $DEFAULT_ADMIN_PORT (管理界面) 被占用" && show_port_info $DEFAULT_ADMIN_PORT + [ $https_port_used -eq 1 ] && echo " - 端口 $DEFAULT_HTTPS_PORT (HTTPS) 被占用" && show_port_info $DEFAULT_HTTPS_PORT + + echo "" + echo "请选择操作:" + echo "1) 自动使用备用端口 (8080, 8081, 8443)" + echo "2) 手动指定端口" + echo "3) 停止占用端口的进程后重试" + echo "4) 退出脚本" + + read -p "请输入选择 (1-4): " choice + + case $choice in + 1) + HTTP_PORT=$ALTERNATE_HTTP_PORT + ADMIN_PORT=$ALTERNATE_ADMIN_PORT + HTTPS_PORT=$ALTERNATE_HTTPS_PORT + echo "使用备用端口: HTTP=$HTTP_PORT, 管理界面=$ADMIN_PORT, HTTPS=$HTTPS_PORT" + ;; + 2) + echo "请手动指定端口:" + read -p "HTTP 端口 (默认 $ALTERNATE_HTTP_PORT): " custom_http + read -p "管理界面端口 (默认 $ALTERNATE_ADMIN_PORT): " custom_admin + read -p "HTTPS 端口 (默认 $ALTERNATE_HTTPS_PORT): " custom_https + + HTTP_PORT=${custom_http:-$ALTERNATE_HTTP_PORT} + ADMIN_PORT=${custom_admin:-$ALTERNATE_ADMIN_PORT} + HTTPS_PORT=${custom_https:-$ALTERNATE_HTTPS_PORT} + + # 检查手动指定的端口是否可用 + echo "检查手动指定端口..." + check_port $HTTP_PORT && http_ok=1 || http_ok=0 + check_port $ADMIN_PORT && admin_ok=1 || admin_ok=0 + check_port $HTTPS_PORT && https_ok=1 || https_ok=0 + + if [ $http_ok -eq 0 ] || [ $admin_ok -eq 0 ] || [ $https_ok -eq 0 ]; then + echo "错误:以下端口仍被占用:" + [ $http_ok -eq 0 ] && echo " - 端口 $HTTP_PORT" && show_port_info $HTTP_PORT + [ $admin_ok -eq 0 ] && echo " - 端口 $ADMIN_PORT" && show_port_info $ADMIN_PORT + [ $https_ok -eq 0 ] && echo " - 端口 $HTTPS_PORT" && show_port_info $HTTPS_PORT + echo "请重新运行脚本选择其他端口" + exit 1 + fi + ;; + 3) + echo "停止占用端口的进程..." + [ $http_port_used -eq 1 ] && sudo fuser -k $DEFAULT_HTTP_PORT/tcp 2>/dev/null + [ $admin_port_used -eq 1 ] && sudo fuser -k $DEFAULT_ADMIN_PORT/tcp 2>/dev/null + [ $https_port_used -eq 1 ] && sudo fuser -k $DEFAULT_HTTPS_PORT/tcp 2>/dev/null + sleep 2 + + # 重新检查端口 + echo "重新检查端口..." + check_port $DEFAULT_HTTP_PORT && http_port_used=0 || http_port_used=1 + check_port $DEFAULT_ADMIN_PORT && admin_port_used=0 || admin_port_used=1 + check_port $DEFAULT_HTTPS_PORT && https_port_used=0 || https_port_used=1 + + if [ $http_port_used -eq 0 ] && [ $admin_port_used -eq 0 ] && [ $https_port_used -eq 0 ]; then + HTTP_PORT=$DEFAULT_HTTP_PORT + ADMIN_PORT=$DEFAULT_ADMIN_PORT + HTTPS_PORT=$DEFAULT_HTTPS_PORT + echo "端口现在可用,使用默认端口" + else + echo "无法释放所有端口,请使用备用端口选项" + exit 1 + fi + ;; + 4) + echo "退出脚本" + exit 0 + ;; + *) + echo "无效选择,使用备用端口" + HTTP_PORT=$ALTERNATE_HTTP_PORT + ADMIN_PORT=$ALTERNATE_ADMIN_PORT + HTTPS_PORT=$ALTERNATE_HTTPS_PORT + ;; + esac +else + # 所有默认端口都可用 + HTTP_PORT=$DEFAULT_HTTP_PORT + ADMIN_PORT=$DEFAULT_ADMIN_PORT + HTTPS_PORT=$DEFAULT_HTTPS_PORT + echo "所有默认端口都可用" +fi + +# 创建 Docker Compose 配置文件 +echo "创建 Docker Compose 配置文件..." +generate_compose_config $HTTP_PORT $ADMIN_PORT $HTTPS_PORT # 检查文件是否创建成功 if [ ! -f "$COMPOSE_FILE" ]; then @@ -72,18 +204,22 @@ if [ $? -eq 0 ]; then echo "等待服务启动..." sleep 5 + SERVER_IP=$(hostname -I | awk '{print $1}') echo "==================================================" echo "Nginx Proxy Manager 部署完成!" - echo "管理界面: http://$(hostname -I | awk '{print $1}'):81" + echo "管理界面: http://${SERVER_IP}:${ADMIN_PORT}" + echo "HTTP 端口: ${HTTP_PORT}" + echo "HTTPS 端口: ${HTTPS_PORT}" echo "初始账号: admin@example.com" echo "初始密码: changeme" echo "==================================================" echo "" echo "重要提示:" echo "1. 首次登录后请立即修改密码" - echo "2. 确保防火墙已开放端口 80、81、443" + echo "2. 确保防火墙已开放端口 ${HTTP_PORT}, ${ADMIN_PORT}, ${HTTPS_PORT}" echo "3. 数据保存在: $SCRIPT_DIR/data" else echo "错误:容器启动失败" + echo "请检查 Docker 日志:docker logs nginx-proxy-manager" exit 1 fi