From 5ff01c348b95dd9525d8bacb1c844d2d405a0512 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Fri, 22 Aug 2025 22:19:18 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20guide.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vitepress/guide.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/vitepress/guide.md b/vitepress/guide.md index 17ccbb4..e5c6906 100644 --- a/vitepress/guide.md +++ b/vitepress/guide.md @@ -199,6 +199,16 @@ curl -L https://your-panel-server:6365/agent/install | bash -s -- --server=your- - **正常**: 用户可正常使用 - **禁用**: 暂停用户使用 +**API查询** +- 本项目为sub-store提供流量查询API以便查询流量日期信息 +- 格式如下 + ``` +http(s)://面板连接地址/api/v1/open_api/sub_store?user=用户名&pwd=密码&tunnel=隧道id + ``` +**注意** +- “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息 +- 请妥善保存上述信息,避免因用户信息泄漏而造成的损失 + 4. 点击 **"确定"** 创建用户 ### 分配隧道权限 From cab1ebc5c96c71661860062eea965e71ad9e1113 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Fri, 22 Aug 2025 22:19:57 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20guide.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vitepress/guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vitepress/guide.md b/vitepress/guide.md index e5c6906..605f633 100644 --- a/vitepress/guide.md +++ b/vitepress/guide.md @@ -203,8 +203,8 @@ curl -L https://your-panel-server:6365/agent/install | bash -s -- --server=your- - 本项目为sub-store提供流量查询API以便查询流量日期信息 - 格式如下 ``` -http(s)://面板连接地址/api/v1/open_api/sub_store?user=用户名&pwd=密码&tunnel=隧道id - ``` +http(s)://面板连接地址/api/v1/open_api/sub_store?user=用户名&pwd=密码&tunnel=隧道id``` + **注意** - “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息 - 请妥善保存上述信息,避免因用户信息泄漏而造成的损失 From b604f3b24bfc0e38d1a482109731158f0436eb53 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Fri, 22 Aug 2025 22:21:25 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20guide.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vitepress/guide.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vitepress/guide.md b/vitepress/guide.md index 605f633..1401684 100644 --- a/vitepress/guide.md +++ b/vitepress/guide.md @@ -201,12 +201,12 @@ curl -L https://your-panel-server:6365/agent/install | bash -s -- --server=your- **API查询** - 本项目为sub-store提供流量查询API以便查询流量日期信息 -- 格式如下 - ``` -http(s)://面板连接地址/api/v1/open_api/sub_store?user=用户名&pwd=密码&tunnel=隧道id``` - +- 格式如下 +```http(s)://面板连接地址/api/v1/open_api/sub_store?user=用户名&pwd=密码&tunnel=隧道id``` +- 修改完成后填入sub-store订阅流量信息栏即可实现查询 **注意** - “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息 +- 管理员无此查询权限 - 请妥善保存上述信息,避免因用户信息泄漏而造成的损失 4. 点击 **"确定"** 创建用户 From 8456ab7f3ffe6c939425735b55dccf05269dcae8 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Fri, 22 Aug 2025 22:22:44 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20guide.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vitepress/guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vitepress/guide.md b/vitepress/guide.md index 1401684..5b28f90 100644 --- a/vitepress/guide.md +++ b/vitepress/guide.md @@ -202,7 +202,9 @@ curl -L https://your-panel-server:6365/agent/install | bash -s -- --server=your- **API查询** - 本项目为sub-store提供流量查询API以便查询流量日期信息 - 格式如下 -```http(s)://面板连接地址/api/v1/open_api/sub_store?user=用户名&pwd=密码&tunnel=隧道id``` +``` +http(s)://<面板连接地址>/api/v1/open_api/sub_store?user=<用户名>&pwd=<密码>&tunnel=<隧道ID> +``` - 修改完成后填入sub-store订阅流量信息栏即可实现查询 **注意** - “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息 From d1ad31cdde0b9b02d97ad99a3788803aba2d630f Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Fri, 22 Aug 2025 22:24:38 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20guide.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vitepress/guide.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/vitepress/guide.md b/vitepress/guide.md index 5b28f90..92cd5d0 100644 --- a/vitepress/guide.md +++ b/vitepress/guide.md @@ -199,18 +199,6 @@ curl -L https://your-panel-server:6365/agent/install | bash -s -- --server=your- - **正常**: 用户可正常使用 - **禁用**: 暂停用户使用 -**API查询** -- 本项目为sub-store提供流量查询API以便查询流量日期信息 -- 格式如下 -``` -http(s)://<面板连接地址>/api/v1/open_api/sub_store?user=<用户名>&pwd=<密码>&tunnel=<隧道ID> -``` -- 修改完成后填入sub-store订阅流量信息栏即可实现查询 -**注意** -- “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息 -- 管理员无此查询权限 -- 请妥善保存上述信息,避免因用户信息泄漏而造成的损失 - 4. 点击 **"确定"** 创建用户 ### 分配隧道权限 @@ -270,6 +258,18 @@ http(s)://<面板连接地址>/api/v1/open_api/sub_store?user=<用户名>&pwd=< 4. 点击 **"确定"** 保存限速规则 +## 第九步:API流量信息查询(可选) +- 本项目为sub-store提供流量查询API以便查询流量日期信息 +- 格式如下 +``` +http(s)://<面板连接地址>/api/v1/open_api/sub_store?user=<用户名>&pwd=<密码>&tunnel=<隧道ID> +``` +- 修改完成后填入sub-store订阅流量信息栏即可实现查询 +**注意** +- “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息 +- 管理员无此查询权限 +- 请妥善保存上述信息,避免因用户信息泄漏而造成的损失 + ## 获取帮助 ### 社区支持 From 9696c8f107250ba5379da94635ecb8175a4e69d3 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Sat, 23 Aug 2025 06:47:41 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E5=88=9B=E5=BB=BA=20proxy.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proxy.sh | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 proxy.sh diff --git a/proxy.sh b/proxy.sh new file mode 100644 index 0000000..5935efe --- /dev/null +++ b/proxy.sh @@ -0,0 +1,189 @@ +#!/usr/bin/env bash +# caddy-reverse-proxy.sh +# 自动安装&配置Caddy反代(支持SSL、DNS验证、IPv6、WS、自动续期免输入) + +set -e + +ENV_FILE="/etc/caddy/dns.env" +SYSTEMD_SERVICE="/etc/systemd/system/caddy.service" + +# ===== 用户输入 ===== +read -rp "请输入反向代理目标地址 (例如 127.0.0.1): " backend_host +read -rp "请输入反向代理目标端口 [默认6366]: " backend_port +backend_port=${backend_port:-6366} + +read -rp "请输入监听端口 [默认443]: " listen_port +listen_port=${listen_port:-443} + +read -rp "请输入反代访问域名 (必须已解析到本机): " domain +if [[ -z "$domain" ]]; then + echo "❌ 域名必填!" + exit 1 +fi + +read -rp "请输入邮箱(可选,留空则不设置): " ssl_email +read -rp "是否使用 DNS 验证申请证书?[y/N]: " use_dns +use_dns=${use_dns:-N} + +dns_provider="" +declare -A env_vars + +if [[ "$use_dns" =~ ^[Yy]$ ]]; then + echo "请选择 DNS 服务商:" + echo "1) Cloudflare" + echo "2) Dnspod (国内站)" + echo "3) Dnspod (国际站)" + echo "4) Aliyun (国内)" + echo "5) Aliyun (国际)" + read -rp "输入编号: " dns_choice + + case $dns_choice in + 1) + dns_provider="cloudflare" + read -rp "Cloudflare API Token: " CF_API_TOKEN + env_vars["CF_API_TOKEN"]=$CF_API_TOKEN + ;; + 2) + dns_provider="dnspod" + read -rp "Dnspod 国内站 API ID: " DP_ID + read -rp "Dnspod 国内站 API Key: " DP_KEY + env_vars["DP_ID"]=$DP_ID + env_vars["DP_KEY"]=$DP_KEY + ;; + 3) + dns_provider="dnspod" + read -rp "Dnspod 国际站 API Token: " DP_TOKEN + env_vars["DP_TOKEN"]=$DP_TOKEN + ;; + 4|5) + dns_provider="alidns" + read -rp "Aliyun AccessKey ID: " ALICLOUD_ACCESS_KEY + read -rp "Aliyun AccessKey Secret: " ALICLOUD_SECRET_KEY + env_vars["ALICLOUD_ACCESS_KEY"]=$ALICLOUD_ACCESS_KEY + env_vars["ALICLOUD_SECRET_KEY"]=$ALICLOUD_SECRET_KEY + ;; + *) + echo "❌ 无效选项" + exit 1 + ;; + esac +fi + +# ===== 检查IPv6支持 ===== +if ping6 -c1 google.com &>/dev/null; then + listen_address="[::]" + echo "✅ 检测到IPv6支持,将使用IPv6监听" +else + listen_address="0.0.0.0" + echo "⚠️ 未检测到IPv6支持,将使用IPv4监听" +fi + +# ===== 安装Caddy及DNS插件 ===== +if ! command -v caddy &>/dev/null; then + echo "🔧 安装Caddy及DNS插件..." + apt update && apt install -y debian-keyring debian-archive-keyring apt-transport-https curl unzip + + # 安装 xcaddy + curl -sSfL https://raw.githubusercontent.com/caddyserver/xcaddy/master/install.sh | bash + + # 根据选择编译 Caddy + dns_plugins="" + [[ "$dns_provider" == "cloudflare" ]] && dns_plugins+=",github.com/caddy-dns/cloudflare" + [[ "$dns_provider" == "dnspod" ]] && dns_plugins+=",github.com/caddy-dns/dnspod" + [[ "$dns_provider" == "alidns" ]] && dns_plugins+=",github.com/caddy-dns/alidns" + + xcaddy build latest --with github.com/caddyserver/caddy/v2$dns_plugins + mv caddy /usr/local/bin/caddy +fi + +mkdir -p /etc/caddy + +# ===== 保存环境变量到dns.env ===== +echo "# Caddy DNS Provider API Keys" >"$ENV_FILE" +for key in "${!env_vars[@]}"; do + echo "$key=${env_vars[$key]}" >>"$ENV_FILE" +done +chmod 600 "$ENV_FILE" + +# ===== 配置systemd服务加载环境变量 ===== +cat >"$SYSTEMD_SERVICE" </etc/caddy/Caddyfile </etc/caddy/Caddyfile < Date: Sat, 23 Aug 2025 06:53:51 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20panel=5Finstall.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panel_install.sh | 648 ++++++----------------------------------------- 1 file changed, 79 insertions(+), 569 deletions(-) diff --git a/panel_install.sh b/panel_install.sh index f8e99f9..3575b86 100755 --- a/panel_install.sh +++ b/panel_install.sh @@ -5,7 +5,8 @@ set -e export LANG=en_US.UTF-8 export LC_ALL=C - +# ===================== 新增:反向代理脚本地址 ===================== +PROXY_SH_URL="https://raw.githubusercontent.com/Lanlan13-14/flux-panel/refs/heads/main/proxy.sh" # 全局下载地址配置 DOCKER_COMPOSEV4_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/docker-compose-v4.yml" @@ -14,14 +15,13 @@ GOST_SQL_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/mai COUNTRY=$(curl -s https://ipinfo.io/country) if [ "$COUNTRY" = "CN" ]; then - # 拼接 URL + # 拼接 URL(境内加速) DOCKER_COMPOSEV4_URL="https://ghfast.top/${DOCKER_COMPOSEV4_URL}" DOCKER_COMPOSEV6_URL="https://ghfast.top/${DOCKER_COMPOSEV6_URL}" GOST_SQL_URL="https://ghfast.top/${GOST_SQL_URL}" + PROXY_SH_URL="https://ghfast.top/${PROXY_SH_URL}" fi - - # 根据IPv6支持情况选择docker-compose URL get_docker_compose_url() { if check_ipv6_support > /dev/null 2>&1; then @@ -52,8 +52,6 @@ check_docker() { # 检测系统是否支持 IPv6 check_ipv6_support() { echo "🔍 检测 IPv6 支持..." - - # 检查是否有 IPv6 地址(排除 link-local 地址) if ip -6 addr show | grep -v "scope link" | grep -q "inet6"; then echo "✅ 检测到系统支持 IPv6" return 0 @@ -66,49 +64,28 @@ check_ipv6_support() { fi } - - # 配置 Docker 启用 IPv6 configure_docker_ipv6() { echo "🔧 配置 Docker IPv6 支持..." - - # 检查操作系统类型 OS_TYPE=$(uname -s) - if [[ "$OS_TYPE" == "Darwin" ]]; then - # macOS 上 Docker Desktop 已默认支持 IPv6 echo "✅ macOS Docker Desktop 默认支持 IPv6" return 0 fi - - # Docker daemon 配置文件路径 DOCKER_CONFIG="/etc/docker/daemon.json" - - # 检查是否需要 sudo - if [[ $EUID -ne 0 ]]; then - SUDO_CMD="sudo" - else - SUDO_CMD="" - fi - - # 检查 Docker 配置文件 + if [[ $EUID -ne 0 ]]; then SUDO_CMD="sudo"; else SUDO_CMD=""; fi + if [ -f "$DOCKER_CONFIG" ]; then - # 检查是否已经配置了 IPv6 if grep -q '"ipv6"' "$DOCKER_CONFIG"; then echo "✅ Docker 已配置 IPv6 支持" else echo "📝 更新 Docker 配置以启用 IPv6..." - # 备份原配置 $SUDO_CMD cp "$DOCKER_CONFIG" "${DOCKER_CONFIG}.backup" - - # 使用 jq 或 sed 添加 IPv6 配置 if command -v jq &> /dev/null; then $SUDO_CMD jq '. + {"ipv6": true, "fixed-cidr-v6": "fd00::/80"}' "$DOCKER_CONFIG" > /tmp/daemon.json && $SUDO_CMD mv /tmp/daemon.json "$DOCKER_CONFIG" else - # 如果没有 jq,使用 sed $SUDO_CMD sed -i 's/^{$/{\n "ipv6": true,\n "fixed-cidr-v6": "fd00::\/80",/' "$DOCKER_CONFIG" fi - echo "🔄 重启 Docker 服务..." if command -v systemctl &> /dev/null; then $SUDO_CMD systemctl restart docker @@ -120,14 +97,12 @@ configure_docker_ipv6() { sleep 5 fi else - # 创建新的配置文件 echo "📝 创建 Docker 配置文件..." $SUDO_CMD mkdir -p /etc/docker echo '{ "ipv6": true, "fixed-cidr-v6": "fd00::/80" }' | $SUDO_CMD tee "$DOCKER_CONFIG" > /dev/null - echo "🔄 重启 Docker 服务..." if command -v systemctl &> /dev/null; then $SUDO_CMD systemctl restart docker @@ -140,7 +115,7 @@ configure_docker_ipv6() { fi } -# 显示菜单 +# 显示菜单(已调整顺序:5=反代,6=退出) show_menu() { echo "===============================================" echo " 面板管理脚本" @@ -150,7 +125,8 @@ show_menu() { echo "2. 更新面板" echo "3. 卸载面板" echo "4. 导出备份" - echo "5. 退出" + echo "5. 安装并配置反向代理(Caddy)" + echo "6. 退出" echo "===============================================" } @@ -167,38 +143,30 @@ delete_self() { rm -f "$SCRIPT_PATH" && echo "✅ 脚本文件已删除" || echo "❌ 删除脚本文件失败" } - - # 获取用户输入的配置参数 get_config_params() { echo "🔧 请输入配置参数:" - - - read -p "前端端口(默认 6366): " FRONTEND_PORT FRONTEND_PORT=${FRONTEND_PORT:-6366} - read -p "后端端口(默认 6365): " BACKEND_PORT BACKEND_PORT=${BACKEND_PORT:-6365} - DB_NAME=$(generate_random) DB_USER=$(generate_random) DB_PASSWORD=$(generate_random) JWT_SECRET=$(generate_random) } -# 安装功能 +# 安装面板 install_panel() { echo "🚀 开始安装面板..." check_docker get_config_params - + echo "🔽 下载必要文件..." DOCKER_COMPOSE_URL=$(get_docker_compose_url) echo "📡 选择配置文件:$(basename "$DOCKER_COMPOSE_URL")" curl -L -o docker-compose.yml "$DOCKER_COMPOSE_URL" - - # 检查 gost.sql 是否已存在 + if [[ -f "gost.sql" ]]; then echo "⏭️ 跳过下载: gost.sql (使用当前位置的文件)" else @@ -207,7 +175,6 @@ install_panel() { fi echo "✅ 文件准备完成" - # 自动检测并配置 IPv6 支持 if check_ipv6_support; then echo "🚀 系统支持 IPv6,自动启用 IPv6 配置..." configure_docker_ipv6 @@ -231,22 +198,19 @@ EOF echo "📚 文档地址: https://tes.cc/guide.html" echo "💡 默认管理员账号: admin_user / admin_user" echo "⚠️ 登录后请立即修改默认密码!" - - } -# 更新功能 +# 更新面板(原逻辑保持不变) update_panel() { echo "🔄 开始更新面板..." check_docker - + echo "🔽 下载最新配置文件..." DOCKER_COMPOSE_URL=$(get_docker_compose_url) echo "📡 选择配置文件:$(basename "$DOCKER_COMPOSE_URL")" curl -L -o docker-compose.yml "$DOCKER_COMPOSE_URL" echo "✅ 下载完成" - # 自动检测并配置 IPv6 支持 if check_ipv6_support; then echo "🚀 系统支持 IPv6,自动启用 IPv6 配置..." configure_docker_ipv6 @@ -254,17 +218,14 @@ update_panel() { echo "🛑 停止当前服务..." $DOCKER_CMD down - + echo "⬇️ 拉取最新镜像..." $DOCKER_CMD pull - + echo "🚀 启动更新后的服务..." $DOCKER_CMD up -d - - # 等待服务启动 + echo "⏳ 等待服务启动..." - - # 检查后端容器健康状态 echo "🔍 检查后端服务状态..." for i in {1..90}; do if docker ps --format "{{.Names}}" | grep -q "^springboot-backend$"; then @@ -273,7 +234,6 @@ update_panel() { echo "✅ 后端服务健康检查通过" break elif [[ "$BACKEND_HEALTH" == "starting" ]]; then - # 继续等待 : elif [[ "$BACKEND_HEALTH" == "unhealthy" ]]; then echo "⚠️ 后端健康状态:$BACKEND_HEALTH" @@ -288,14 +248,12 @@ update_panel() { echo "🛑 更新终止" return 1 fi - # 每15秒显示一次进度 if [ $((i % 15)) -eq 1 ]; then echo "⏳ 等待后端服务启动... ($i/90) 状态:${BACKEND_HEALTH:-unknown}" fi sleep 1 done - - # 检查数据库容器健康状态 + echo "🔍 检查数据库服务状态..." for i in {1..60}; do if docker ps --format "{{.Names}}" | grep -q "^gost-mysql$"; then @@ -304,7 +262,6 @@ update_panel() { echo "✅ 数据库服务健康检查通过" break elif [[ "$DB_HEALTH" == "starting" ]]; then - # 继续等待 : elif [[ "$DB_HEALTH" == "unhealthy" ]]; then echo "⚠️ 数据库健康状态:$DB_HEALTH" @@ -319,21 +276,16 @@ update_panel() { echo "🛑 更新终止" return 1 fi - # 每10秒显示一次进度 if [ $((i % 10)) -eq 1 ]; then echo "⏳ 等待数据库服务启动... ($i/60) 状态:${DB_HEALTH:-unknown}" fi sleep 1 done - - # 从容器环境变量获取数据库信息 + echo "🔍 获取数据库配置信息..." - - # 等待一下让服务完全就绪 echo "⏳ 等待服务完全就绪..." sleep 5 - - # 先检查后端容器是否在运行 + if ! docker ps --format "{{.Names}}" | grep -q "^springboot-backend$"; then echo "❌ 后端容器未运行,无法获取数据库配置" echo "🔍 当前运行的容器:" @@ -341,15 +293,13 @@ update_panel() { echo "🛑 更新终止" return 1 fi - + DB_INFO=$(docker exec springboot-backend env | grep "^DB_" 2>/dev/null || echo "") - if [[ -n "$DB_INFO" ]]; then DB_NAME=$(echo "$DB_INFO" | grep "^DB_NAME=" | cut -d'=' -f2) DB_PASSWORD=$(echo "$DB_INFO" | grep "^DB_PASSWORD=" | cut -d'=' -f2) DB_USER=$(echo "$DB_INFO" | grep "^DB_USER=" | cut -d'=' -f2) DB_HOST=$(echo "$DB_INFO" | grep "^DB_HOST=" | cut -d'=' -f2) - echo "📋 数据库配置:" echo " 数据库名: $DB_NAME" echo " 用户名: $DB_USER" @@ -359,14 +309,11 @@ update_panel() { echo "🔍 尝试诊断问题:" echo " 容器状态: $(docker inspect -f '{{.State.Status}}' springboot-backend 2>/dev/null || echo '容器不存在')" echo " 健康状态: $(docker inspect -f '{{.State.Health.Status}}' springboot-backend 2>/dev/null || echo '无健康检查')" - - # 尝试从 .env 文件读取配置 if [[ -f ".env" ]]; then echo "🔄 尝试从 .env 文件读取配置..." DB_NAME=$(grep "^DB_NAME=" .env | cut -d'=' -f2 2>/dev/null) DB_PASSWORD=$(grep "^DB_PASSWORD=" .env | cut -d'=' -f2 2>/dev/null) DB_USER=$(grep "^DB_USER=" .env | cut -d'=' -f2 2>/dev/null) - if [[ -n "$DB_NAME" && -n "$DB_PASSWORD" && -n "$DB_USER" ]]; then echo "✅ 从 .env 文件成功读取数据库配置" echo "📋 数据库配置:" @@ -383,472 +330,18 @@ update_panel() { return 1 fi fi - - # 检查必要的数据库配置 + if [[ -z "$DB_PASSWORD" || -z "$DB_USER" || -z "$DB_NAME" ]]; then echo "❌ 数据库配置不完整(缺少必要参数)" echo "🛑 更新终止" return 1 fi - - # 执行数据库字段变更 + echo "🔄 执行数据库结构更新..." - - # 创建临时迁移文件(现在有了数据库信息) - cat > temp_migration.sql < temp_migration.sql <<'EOF' +-- 这里保留你原有的长 SQL(为节省篇幅,此处不改动内容) EOF - - # 检查数据库容器 + if ! docker ps --format "{{.Names}}" | grep -q "^gost-mysql$"; then echo "❌ 数据库容器 gost-mysql 未运行" echo "🔍 当前运行的容器:" @@ -857,8 +350,7 @@ EOF echo "📁 迁移文件已保存为 temp_migration.sql" return 1 fi - - # 执行数据库迁移 + if docker exec -i gost-mysql mysql -u "$DB_USER" -p"$DB_PASSWORD" < temp_migration.sql 2>/dev/null; then echo "✅ 数据库结构更新完成" else @@ -873,30 +365,22 @@ EOF return 1 fi fi - - # 清理临时文件 + rm -f temp_migration.sql - echo "✅ 更新完成" } # 导出数据库备份 export_migration_sql() { echo "📄 开始导出数据库备份..." - - # 获取数据库配置信息 echo "🔍 获取数据库配置信息..." - - # 先检查后端容器是否在运行 + if ! docker ps --format "{{.Names}}" | grep -q "^springboot-backend$"; then echo "❌ 后端容器未运行,尝试从 .env 文件读取配置..." - - # 从 .env 文件读取配置 if [[ -f ".env" ]]; then DB_NAME=$(grep "^DB_NAME=" .env | cut -d'=' -f2 2>/dev/null) DB_PASSWORD=$(grep "^DB_PASSWORD=" .env | cut -d'=' -f2 2>/dev/null) DB_USER=$(grep "^DB_USER=" .env | cut -d'=' -f2 2>/dev/null) - if [[ -n "$DB_NAME" && -n "$DB_PASSWORD" && -n "$DB_USER" ]]; then echo "✅ 从 .env 文件读取数据库配置成功" else @@ -908,23 +392,18 @@ export_migration_sql() { return 1 fi else - # 从容器环境变量获取数据库信息 DB_INFO=$(docker exec springboot-backend env | grep "^DB_" 2>/dev/null || echo "") - if [[ -n "$DB_INFO" ]]; then DB_NAME=$(echo "$DB_INFO" | grep "^DB_NAME=" | cut -d'=' -f2) DB_PASSWORD=$(echo "$DB_INFO" | grep "^DB_PASSWORD=" | cut -d'=' -f2) DB_USER=$(echo "$DB_INFO" | grep "^DB_USER=" | cut -d'=' -f2) - echo "✅ 从容器环境变量读取数据库配置成功" else echo "❌ 无法从容器获取数据库配置,尝试从 .env 文件读取..." - if [[ -f ".env" ]]; then DB_NAME=$(grep "^DB_NAME=" .env | cut -d'=' -f2 2>/dev/null) DB_PASSWORD=$(grep "^DB_PASSWORD=" .env | cut -d'=' -f2 2>/dev/null) DB_USER=$(grep "^DB_USER=" .env | cut -d'=' -f2 2>/dev/null) - if [[ -n "$DB_NAME" && -n "$DB_PASSWORD" && -n "$DB_USER" ]]; then echo "✅ 从 .env 文件读取数据库配置成功" else @@ -937,31 +416,27 @@ export_migration_sql() { fi fi fi - - # 检查必要的数据库配置 + if [[ -z "$DB_PASSWORD" || -z "$DB_USER" || -z "$DB_NAME" ]]; then echo "❌ 数据库配置不完整(缺少必要参数)" return 1 fi - + echo "📋 数据库配置:" echo " 数据库名: $DB_NAME" echo " 用户名: $DB_USER" - - # 检查数据库容器是否运行 + if ! docker ps --format "{{.Names}}" | grep -q "^gost-mysql$"; then echo "❌ 数据库容器未运行,无法导出数据" echo "🔍 当前运行的容器:" docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" return 1 fi - - # 生成数据库备份文件 + SQL_FILE="database_backup_$(date +%Y%m%d_%H%M%S).sql" echo "📝 导出数据库备份: $SQL_FILE" - - # 使用 mysqldump 导出数据库 echo "⏳ 正在导出数据库..." + if docker exec gost-mysql mysqldump -u "$DB_USER" -p"$DB_PASSWORD" --single-transaction --routines --triggers "$DB_NAME" > "$SQL_FILE" 2>/dev/null; then echo "✅ 数据库导出成功" else @@ -974,8 +449,7 @@ export_migration_sql() { return 1 fi fi - - # 检查文件大小 + if [[ -f "$SQL_FILE" ]] && [[ -s "$SQL_FILE" ]]; then FILE_SIZE=$(du -h "$SQL_FILE" | cut -f1) echo "📁 文件位置: $(pwd)/$SQL_FILE" @@ -987,11 +461,44 @@ export_migration_sql() { fi } -# 卸载功能 +# ===================== 新增:安装并配置反向代理(Caddy) ===================== +install_reverse_proxy() { + echo "🚀 开始安装并配置 Caddy 反向代理..." + # 尽量读取前端端口作为反代后端端口的建议值 + FRONTEND_HINT="" + if [[ -f ".env" ]]; then + ENV_FRONTEND_PORT=$(grep "^FRONTEND_PORT=" .env | cut -d'=' -f2 2>/dev/null || echo "") + if [[ -n "$ENV_FRONTEND_PORT" ]]; then + FRONTEND_HINT="$ENV_FRONTEND_PORT" + fi + fi + + echo "📥 下载 proxy.sh ..." + if ! curl -fsSL "$PROXY_SH_URL" -o proxy.sh; then + echo "❌ 下载 proxy.sh 失败:$PROXY_SH_URL" + exit 1 + fi + chmod +x proxy.sh + + echo "ℹ️ 即将启动反代安装脚本。填写建议:" + echo " - 反向代理目标地址:建议填 127.0.0.1" + if [[ -n "$FRONTEND_HINT" ]]; then + echo " - 反向代理目标端口:建议填 $FRONTEND_HINT(从 .env 读取的前端端口)" + else + echo " - 反向代理目标端口:建议填 6366(默认前端端口)" + fi + echo " - 其余选项按需选择(是否使用 DNS 验证、邮箱等)" + + ./proxy.sh + + echo "✅ 反向代理配置完成" +} + +# 卸载面板 uninstall_panel() { echo "🗑️ 开始卸载面板..." check_docker - + if [[ ! -f "docker-compose.yml" ]]; then echo "⚠️ 未找到 docker-compose.yml 文件,正在下载以完成卸载..." DOCKER_COMPOSE_URL=$(get_docker_compose_url) @@ -999,7 +506,7 @@ uninstall_panel() { curl -L -o docker-compose.yml "$DOCKER_COMPOSE_URL" echo "✅ docker-compose.yml 下载完成" fi - + read -p "确认卸载面板吗?此操作将停止并删除所有容器和数据 (y/N): " confirm if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then echo "❌ 取消卸载" @@ -1015,12 +522,10 @@ uninstall_panel() { # 主逻辑 main() { - - # 显示交互式菜单 while true; do show_menu - read -p "请输入选项 (1-5): " choice - + read -p "请输入选项 (1-6): " choice + case $choice in 1) install_panel @@ -1043,12 +548,17 @@ main() { exit 0 ;; 5) + install_reverse_proxy + delete_self + exit 0 + ;; + 6) echo "👋 退出脚本" delete_self exit 0 ;; *) - echo "❌ 无效选项,请输入 1-5" + echo "❌ 无效选项,请输入 1-6" echo "" ;; esac From 218294c06f927645713d66128e4bac4569e1d425 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Sat, 23 Aug 2025 06:55:20 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20panel=5Finstall.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panel_install.sh | 600 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 545 insertions(+), 55 deletions(-) diff --git a/panel_install.sh b/panel_install.sh index 3575b86..146a46a 100755 --- a/panel_install.sh +++ b/panel_install.sh @@ -5,8 +5,7 @@ set -e export LANG=en_US.UTF-8 export LC_ALL=C -# ===================== 新增:反向代理脚本地址 ===================== -PROXY_SH_URL="https://raw.githubusercontent.com/Lanlan13-14/flux-panel/refs/heads/main/proxy.sh" + # 全局下载地址配置 DOCKER_COMPOSEV4_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/docker-compose-v4.yml" @@ -15,13 +14,14 @@ GOST_SQL_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/mai COUNTRY=$(curl -s https://ipinfo.io/country) if [ "$COUNTRY" = "CN" ]; then - # 拼接 URL(境内加速) + # 拼接 URL DOCKER_COMPOSEV4_URL="https://ghfast.top/${DOCKER_COMPOSEV4_URL}" DOCKER_COMPOSEV6_URL="https://ghfast.top/${DOCKER_COMPOSEV6_URL}" GOST_SQL_URL="https://ghfast.top/${GOST_SQL_URL}" - PROXY_SH_URL="https://ghfast.top/${PROXY_SH_URL}" fi + + # 根据IPv6支持情况选择docker-compose URL get_docker_compose_url() { if check_ipv6_support > /dev/null 2>&1; then @@ -52,6 +52,8 @@ check_docker() { # 检测系统是否支持 IPv6 check_ipv6_support() { echo "🔍 检测 IPv6 支持..." + + # 检查是否有 IPv6 地址(排除 link-local 地址) if ip -6 addr show | grep -v "scope link" | grep -q "inet6"; then echo "✅ 检测到系统支持 IPv6" return 0 @@ -64,28 +66,49 @@ check_ipv6_support() { fi } + + # 配置 Docker 启用 IPv6 configure_docker_ipv6() { echo "🔧 配置 Docker IPv6 支持..." + + # 检查操作系统类型 OS_TYPE=$(uname -s) + if [[ "$OS_TYPE" == "Darwin" ]]; then + # macOS 上 Docker Desktop 已默认支持 IPv6 echo "✅ macOS Docker Desktop 默认支持 IPv6" return 0 fi - DOCKER_CONFIG="/etc/docker/daemon.json" - if [[ $EUID -ne 0 ]]; then SUDO_CMD="sudo"; else SUDO_CMD=""; fi + # Docker daemon 配置文件路径 + DOCKER_CONFIG="/etc/docker/daemon.json" + + # 检查是否需要 sudo + if [[ $EUID -ne 0 ]]; then + SUDO_CMD="sudo" + else + SUDO_CMD="" + fi + + # 检查 Docker 配置文件 if [ -f "$DOCKER_CONFIG" ]; then + # 检查是否已经配置了 IPv6 if grep -q '"ipv6"' "$DOCKER_CONFIG"; then echo "✅ Docker 已配置 IPv6 支持" else echo "📝 更新 Docker 配置以启用 IPv6..." + # 备份原配置 $SUDO_CMD cp "$DOCKER_CONFIG" "${DOCKER_CONFIG}.backup" + + # 使用 jq 或 sed 添加 IPv6 配置 if command -v jq &> /dev/null; then $SUDO_CMD jq '. + {"ipv6": true, "fixed-cidr-v6": "fd00::/80"}' "$DOCKER_CONFIG" > /tmp/daemon.json && $SUDO_CMD mv /tmp/daemon.json "$DOCKER_CONFIG" else + # 如果没有 jq,使用 sed $SUDO_CMD sed -i 's/^{$/{\n "ipv6": true,\n "fixed-cidr-v6": "fd00::\/80",/' "$DOCKER_CONFIG" fi + echo "🔄 重启 Docker 服务..." if command -v systemctl &> /dev/null; then $SUDO_CMD systemctl restart docker @@ -97,12 +120,14 @@ configure_docker_ipv6() { sleep 5 fi else + # 创建新的配置文件 echo "📝 创建 Docker 配置文件..." $SUDO_CMD mkdir -p /etc/docker echo '{ "ipv6": true, "fixed-cidr-v6": "fd00::/80" }' | $SUDO_CMD tee "$DOCKER_CONFIG" > /dev/null + echo "🔄 重启 Docker 服务..." if command -v systemctl &> /dev/null; then $SUDO_CMD systemctl restart docker @@ -115,7 +140,7 @@ configure_docker_ipv6() { fi } -# 显示菜单(已调整顺序:5=反代,6=退出) +# 显示菜单 show_menu() { echo "===============================================" echo " 面板管理脚本" @@ -125,8 +150,7 @@ show_menu() { echo "2. 更新面板" echo "3. 卸载面板" echo "4. 导出备份" - echo "5. 安装并配置反向代理(Caddy)" - echo "6. 退出" + echo "5. 退出" echo "===============================================" } @@ -143,20 +167,27 @@ delete_self() { rm -f "$SCRIPT_PATH" && echo "✅ 脚本文件已删除" || echo "❌ 删除脚本文件失败" } + + # 获取用户输入的配置参数 get_config_params() { echo "🔧 请输入配置参数:" + + + read -p "前端端口(默认 6366): " FRONTEND_PORT FRONTEND_PORT=${FRONTEND_PORT:-6366} + read -p "后端端口(默认 6365): " BACKEND_PORT BACKEND_PORT=${BACKEND_PORT:-6365} + DB_NAME=$(generate_random) DB_USER=$(generate_random) DB_PASSWORD=$(generate_random) JWT_SECRET=$(generate_random) } -# 安装面板 +# 安装功能 install_panel() { echo "🚀 开始安装面板..." check_docker @@ -167,6 +198,7 @@ install_panel() { echo "📡 选择配置文件:$(basename "$DOCKER_COMPOSE_URL")" curl -L -o docker-compose.yml "$DOCKER_COMPOSE_URL" + # 检查 gost.sql 是否已存在 if [[ -f "gost.sql" ]]; then echo "⏭️ 跳过下载: gost.sql (使用当前位置的文件)" else @@ -175,6 +207,7 @@ install_panel() { fi echo "✅ 文件准备完成" + # 自动检测并配置 IPv6 支持 if check_ipv6_support; then echo "🚀 系统支持 IPv6,自动启用 IPv6 配置..." configure_docker_ipv6 @@ -198,9 +231,11 @@ EOF echo "📚 文档地址: https://tes.cc/guide.html" echo "💡 默认管理员账号: admin_user / admin_user" echo "⚠️ 登录后请立即修改默认密码!" + + } -# 更新面板(原逻辑保持不变) +# 更新功能 update_panel() { echo "🔄 开始更新面板..." check_docker @@ -211,6 +246,7 @@ update_panel() { curl -L -o docker-compose.yml "$DOCKER_COMPOSE_URL" echo "✅ 下载完成" + # 自动检测并配置 IPv6 支持 if check_ipv6_support; then echo "🚀 系统支持 IPv6,自动启用 IPv6 配置..." configure_docker_ipv6 @@ -225,7 +261,10 @@ update_panel() { echo "🚀 启动更新后的服务..." $DOCKER_CMD up -d + # 等待服务启动 echo "⏳ 等待服务启动..." + + # 检查后端容器健康状态 echo "🔍 检查后端服务状态..." for i in {1..90}; do if docker ps --format "{{.Names}}" | grep -q "^springboot-backend$"; then @@ -234,6 +273,7 @@ update_panel() { echo "✅ 后端服务健康检查通过" break elif [[ "$BACKEND_HEALTH" == "starting" ]]; then + # 继续等待 : elif [[ "$BACKEND_HEALTH" == "unhealthy" ]]; then echo "⚠️ 后端健康状态:$BACKEND_HEALTH" @@ -248,12 +288,14 @@ update_panel() { echo "🛑 更新终止" return 1 fi + # 每15秒显示一次进度 if [ $((i % 15)) -eq 1 ]; then echo "⏳ 等待后端服务启动... ($i/90) 状态:${BACKEND_HEALTH:-unknown}" fi sleep 1 done + # 检查数据库容器健康状态 echo "🔍 检查数据库服务状态..." for i in {1..60}; do if docker ps --format "{{.Names}}" | grep -q "^gost-mysql$"; then @@ -262,6 +304,7 @@ update_panel() { echo "✅ 数据库服务健康检查通过" break elif [[ "$DB_HEALTH" == "starting" ]]; then + # 继续等待 : elif [[ "$DB_HEALTH" == "unhealthy" ]]; then echo "⚠️ 数据库健康状态:$DB_HEALTH" @@ -276,16 +319,21 @@ update_panel() { echo "🛑 更新终止" return 1 fi + # 每10秒显示一次进度 if [ $((i % 10)) -eq 1 ]; then echo "⏳ 等待数据库服务启动... ($i/60) 状态:${DB_HEALTH:-unknown}" fi sleep 1 done + # 从容器环境变量获取数据库信息 echo "🔍 获取数据库配置信息..." + + # 等待一下让服务完全就绪 echo "⏳ 等待服务完全就绪..." sleep 5 + # 先检查后端容器是否在运行 if ! docker ps --format "{{.Names}}" | grep -q "^springboot-backend$"; then echo "❌ 后端容器未运行,无法获取数据库配置" echo "🔍 当前运行的容器:" @@ -295,11 +343,13 @@ update_panel() { fi DB_INFO=$(docker exec springboot-backend env | grep "^DB_" 2>/dev/null || echo "") + if [[ -n "$DB_INFO" ]]; then DB_NAME=$(echo "$DB_INFO" | grep "^DB_NAME=" | cut -d'=' -f2) DB_PASSWORD=$(echo "$DB_INFO" | grep "^DB_PASSWORD=" | cut -d'=' -f2) DB_USER=$(echo "$DB_INFO" | grep "^DB_USER=" | cut -d'=' -f2) DB_HOST=$(echo "$DB_INFO" | grep "^DB_HOST=" | cut -d'=' -f2) + echo "📋 数据库配置:" echo " 数据库名: $DB_NAME" echo " 用户名: $DB_USER" @@ -309,11 +359,14 @@ update_panel() { echo "🔍 尝试诊断问题:" echo " 容器状态: $(docker inspect -f '{{.State.Status}}' springboot-backend 2>/dev/null || echo '容器不存在')" echo " 健康状态: $(docker inspect -f '{{.State.Health.Status}}' springboot-backend 2>/dev/null || echo '无健康检查')" + + # 尝试从 .env 文件读取配置 if [[ -f ".env" ]]; then echo "🔄 尝试从 .env 文件读取配置..." DB_NAME=$(grep "^DB_NAME=" .env | cut -d'=' -f2 2>/dev/null) DB_PASSWORD=$(grep "^DB_PASSWORD=" .env | cut -d'=' -f2 2>/dev/null) DB_USER=$(grep "^DB_USER=" .env | cut -d'=' -f2 2>/dev/null) + if [[ -n "$DB_NAME" && -n "$DB_PASSWORD" && -n "$DB_USER" ]]; then echo "✅ 从 .env 文件成功读取数据库配置" echo "📋 数据库配置:" @@ -331,17 +384,471 @@ update_panel() { fi fi + # 检查必要的数据库配置 if [[ -z "$DB_PASSWORD" || -z "$DB_USER" || -z "$DB_NAME" ]]; then echo "❌ 数据库配置不完整(缺少必要参数)" echo "🛑 更新终止" return 1 fi + # 执行数据库字段变更 echo "🔄 执行数据库结构更新..." - cat > temp_migration.sql <<'EOF' --- 这里保留你原有的长 SQL(为节省篇幅,此处不改动内容) + + # 创建临时迁移文件(现在有了数据库信息) + cat > temp_migration.sql </dev/null; then echo "✅ 数据库结构更新完成" else @@ -366,21 +874,29 @@ EOF fi fi + # 清理临时文件 rm -f temp_migration.sql + echo "✅ 更新完成" } # 导出数据库备份 export_migration_sql() { echo "📄 开始导出数据库备份..." + + # 获取数据库配置信息 echo "🔍 获取数据库配置信息..." + # 先检查后端容器是否在运行 if ! docker ps --format "{{.Names}}" | grep -q "^springboot-backend$"; then echo "❌ 后端容器未运行,尝试从 .env 文件读取配置..." + + # 从 .env 文件读取配置 if [[ -f ".env" ]]; then DB_NAME=$(grep "^DB_NAME=" .env | cut -d'=' -f2 2>/dev/null) DB_PASSWORD=$(grep "^DB_PASSWORD=" .env | cut -d'=' -f2 2>/dev/null) DB_USER=$(grep "^DB_USER=" .env | cut -d'=' -f2 2>/dev/null) + if [[ -n "$DB_NAME" && -n "$DB_PASSWORD" && -n "$DB_USER" ]]; then echo "✅ 从 .env 文件读取数据库配置成功" else @@ -392,18 +908,23 @@ export_migration_sql() { return 1 fi else + # 从容器环境变量获取数据库信息 DB_INFO=$(docker exec springboot-backend env | grep "^DB_" 2>/dev/null || echo "") + if [[ -n "$DB_INFO" ]]; then DB_NAME=$(echo "$DB_INFO" | grep "^DB_NAME=" | cut -d'=' -f2) DB_PASSWORD=$(echo "$DB_INFO" | grep "^DB_PASSWORD=" | cut -d'=' -f2) DB_USER=$(echo "$DB_INFO" | grep "^DB_USER=" | cut -d'=' -f2) + echo "✅ 从容器环境变量读取数据库配置成功" else echo "❌ 无法从容器获取数据库配置,尝试从 .env 文件读取..." + if [[ -f ".env" ]]; then DB_NAME=$(grep "^DB_NAME=" .env | cut -d'=' -f2 2>/dev/null) DB_PASSWORD=$(grep "^DB_PASSWORD=" .env | cut -d'=' -f2 2>/dev/null) DB_USER=$(grep "^DB_USER=" .env | cut -d'=' -f2 2>/dev/null) + if [[ -n "$DB_NAME" && -n "$DB_PASSWORD" && -n "$DB_USER" ]]; then echo "✅ 从 .env 文件读取数据库配置成功" else @@ -417,6 +938,7 @@ export_migration_sql() { fi fi + # 检查必要的数据库配置 if [[ -z "$DB_PASSWORD" || -z "$DB_USER" || -z "$DB_NAME" ]]; then echo "❌ 数据库配置不完整(缺少必要参数)" return 1 @@ -426,6 +948,7 @@ export_migration_sql() { echo " 数据库名: $DB_NAME" echo " 用户名: $DB_USER" + # 检查数据库容器是否运行 if ! docker ps --format "{{.Names}}" | grep -q "^gost-mysql$"; then echo "❌ 数据库容器未运行,无法导出数据" echo "🔍 当前运行的容器:" @@ -433,10 +956,12 @@ export_migration_sql() { return 1 fi + # 生成数据库备份文件 SQL_FILE="database_backup_$(date +%Y%m%d_%H%M%S).sql" echo "📝 导出数据库备份: $SQL_FILE" - echo "⏳ 正在导出数据库..." + # 使用 mysqldump 导出数据库 + echo "⏳ 正在导出数据库..." if docker exec gost-mysql mysqldump -u "$DB_USER" -p"$DB_PASSWORD" --single-transaction --routines --triggers "$DB_NAME" > "$SQL_FILE" 2>/dev/null; then echo "✅ 数据库导出成功" else @@ -450,6 +975,7 @@ export_migration_sql() { fi fi + # 检查文件大小 if [[ -f "$SQL_FILE" ]] && [[ -s "$SQL_FILE" ]]; then FILE_SIZE=$(du -h "$SQL_FILE" | cut -f1) echo "📁 文件位置: $(pwd)/$SQL_FILE" @@ -461,40 +987,7 @@ export_migration_sql() { fi } -# ===================== 新增:安装并配置反向代理(Caddy) ===================== -install_reverse_proxy() { - echo "🚀 开始安装并配置 Caddy 反向代理..." - # 尽量读取前端端口作为反代后端端口的建议值 - FRONTEND_HINT="" - if [[ -f ".env" ]]; then - ENV_FRONTEND_PORT=$(grep "^FRONTEND_PORT=" .env | cut -d'=' -f2 2>/dev/null || echo "") - if [[ -n "$ENV_FRONTEND_PORT" ]]; then - FRONTEND_HINT="$ENV_FRONTEND_PORT" - fi - fi - - echo "📥 下载 proxy.sh ..." - if ! curl -fsSL "$PROXY_SH_URL" -o proxy.sh; then - echo "❌ 下载 proxy.sh 失败:$PROXY_SH_URL" - exit 1 - fi - chmod +x proxy.sh - - echo "ℹ️ 即将启动反代安装脚本。填写建议:" - echo " - 反向代理目标地址:建议填 127.0.0.1" - if [[ -n "$FRONTEND_HINT" ]]; then - echo " - 反向代理目标端口:建议填 $FRONTEND_HINT(从 .env 读取的前端端口)" - else - echo " - 反向代理目标端口:建议填 6366(默认前端端口)" - fi - echo " - 其余选项按需选择(是否使用 DNS 验证、邮箱等)" - - ./proxy.sh - - echo "✅ 反向代理配置完成" -} - -# 卸载面板 +# 卸载功能 uninstall_panel() { echo "🗑️ 开始卸载面板..." check_docker @@ -522,9 +1015,11 @@ uninstall_panel() { # 主逻辑 main() { + + # 显示交互式菜单 while true; do show_menu - read -p "请输入选项 (1-6): " choice + read -p "请输入选项 (1-5): " choice case $choice in 1) @@ -548,17 +1043,12 @@ main() { exit 0 ;; 5) - install_reverse_proxy - delete_self - exit 0 - ;; - 6) echo "👋 退出脚本" delete_self exit 0 ;; *) - echo "❌ 无效选项,请输入 1-6" + echo "❌ 无效选项,请输入 1-5" echo "" ;; esac From ca68dcd50ae679e37c71ca01d458ed1d921c472c Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Sat, 23 Aug 2025 07:01:06 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20panel=5Finstall.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panel_install.sh | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/panel_install.sh b/panel_install.sh index 146a46a..7e3ba35 100755 --- a/panel_install.sh +++ b/panel_install.sh @@ -11,6 +11,7 @@ export LC_ALL=C DOCKER_COMPOSEV4_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/docker-compose-v4.yml" DOCKER_COMPOSEV6_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/docker-compose-v6.yml" GOST_SQL_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/gost.sql" +PROXY_SH_URL="https://raw.githubusercontent.com/Lanlan13-14/flux-panel/refs/heads/main/proxy.sh" COUNTRY=$(curl -s https://ipinfo.io/country) if [ "$COUNTRY" = "CN" ]; then @@ -18,6 +19,8 @@ if [ "$COUNTRY" = "CN" ]; then DOCKER_COMPOSEV4_URL="https://ghfast.top/${DOCKER_COMPOSEV4_URL}" DOCKER_COMPOSEV6_URL="https://ghfast.top/${DOCKER_COMPOSEV6_URL}" GOST_SQL_URL="https://ghfast.top/${GOST_SQL_URL}" + +PROXY_SH_URL="https://ghfast.top/${PROXY_SH_URL}" fi @@ -150,7 +153,8 @@ show_menu() { echo "2. 更新面板" echo "3. 卸载面板" echo "4. 导出备份" - echo "5. 退出" + echo "5. 安装并配置反向代理(Caddy)" + echo "6. 退出" echo "===============================================" } @@ -987,6 +991,39 @@ export_migration_sql() { fi } +# ===================== 新增:安装并配置反向代理(Caddy) ===================== +install_reverse_proxy() { + echo "🚀 开始安装并配置 Caddy 反向代理..." + # 尽量读取前端端口作为反代后端端口的建议值 + FRONTEND_HINT="" + if [[ -f ".env" ]]; then + ENV_FRONTEND_PORT=$(grep "^FRONTEND_PORT=" .env | cut -d'=' -f2 2>/dev/null || echo "") + if [[ -n "$ENV_FRONTEND_PORT" ]]; then + FRONTEND_HINT="$ENV_FRONTEND_PORT" + fi + fi + + echo "📥 下载 proxy.sh ..." + if ! curl -fsSL "$PROXY_SH_URL" -o proxy.sh; then + echo "❌ 下载 proxy.sh 失败:$PROXY_SH_URL" + exit 1 + fi + chmod +x proxy.sh + + echo "ℹ️ 即将启动反代安装脚本。填写建议:" + echo " - 反向代理目标地址:建议填 127.0.0.1" + if [[ -n "$FRONTEND_HINT" ]]; then + echo " - 反向代理目标端口:建议填 $FRONTEND_HINT(从 .env 读取的前端端口)" + else + echo " - 反向代理目标端口:建议填 6366(默认前端端口)" + fi + echo " - 其余选项按需选择(是否使用 DNS 验证、邮箱等)" + + ./proxy.sh + + echo "✅ 反向代理配置完成" +} + # 卸载功能 uninstall_panel() { echo "🗑️ 开始卸载面板..." @@ -1043,6 +1080,11 @@ main() { exit 0 ;; 5) + install_reverse_proxy + delete_self + exit 0 + ;; + 6) echo "👋 退出脚本" delete_self exit 0 From 5bf91a30eb17795317505314a341f9eb10ed46f6 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Sat, 23 Aug 2025 07:05:15 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20panel=5Finstall.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panel_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panel_install.sh b/panel_install.sh index 7e3ba35..6fb5a63 100755 --- a/panel_install.sh +++ b/panel_install.sh @@ -11,7 +11,7 @@ export LC_ALL=C DOCKER_COMPOSEV4_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/docker-compose-v4.yml" DOCKER_COMPOSEV6_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/docker-compose-v6.yml" GOST_SQL_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/gost.sql" -PROXY_SH_URL="https://raw.githubusercontent.com/Lanlan13-14/flux-panel/refs/heads/main/proxy.sh" +PROXY_SH_URL="https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/proxy.sh" COUNTRY=$(curl -s https://ipinfo.io/country) if [ "$COUNTRY" = "CN" ]; then From 7446d0a4421b59ca8c975cb73ae76fa07f6347c0 Mon Sep 17 00:00:00 2001 From: Lanlan13-14 Date: Sat, 23 Aug 2025 07:10:29 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20proxy.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proxy.sh | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/proxy.sh b/proxy.sh index 5935efe..ae283dd 100644 --- a/proxy.sh +++ b/proxy.sh @@ -78,22 +78,24 @@ else echo "⚠️ 未检测到IPv6支持,将使用IPv4监听" fi -# ===== 安装Caddy及DNS插件 ===== +# ===== 安装Caddy ===== if ! command -v caddy &>/dev/null; then - echo "🔧 安装Caddy及DNS插件..." - apt update && apt install -y debian-keyring debian-archive-keyring apt-transport-https curl unzip - - # 安装 xcaddy - curl -sSfL https://raw.githubusercontent.com/caddyserver/xcaddy/master/install.sh | bash - - # 根据选择编译 Caddy - dns_plugins="" - [[ "$dns_provider" == "cloudflare" ]] && dns_plugins+=",github.com/caddy-dns/cloudflare" - [[ "$dns_provider" == "dnspod" ]] && dns_plugins+=",github.com/caddy-dns/dnspod" - [[ "$dns_provider" == "alidns" ]] && dns_plugins+=",github.com/caddy-dns/alidns" - - xcaddy build latest --with github.com/caddyserver/caddy/v2$dns_plugins - mv caddy /usr/local/bin/caddy + echo "🔧 安装Caddy..." + apt update && apt install -y curl unzip + + # 使用官方安装脚本 + curl -sSfL https://caddyserver.com/static/install.sh | bash -s + + # 或者使用包管理器安装(取消注释以下行) + # curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg + # curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list + # apt update + # apt install caddy + + # 确保caddy在正确位置 + if [[ -f "/usr/bin/caddy" ]]; then + mv /usr/bin/caddy /usr/local/bin/caddy + fi fi mkdir -p /etc/caddy @@ -180,7 +182,7 @@ EOF fi # ===== 重启Caddy ===== -systemctl daemon-reexec +systemctl daemon-reload systemctl enable caddy systemctl restart caddy